2016-08-10 4 views
0

프로젝트 작업을위한 API를 만들고 있습니다. 아래 나열된 TasksController가 있습니다. WebApi.Hal을 사용하여 하이퍼 미디어를 생성 중이며 hal+jsonhal+xmlmedia types도 지원합니다.HAL에서 연결된 리소스의 관련 이름을 얻는 방법

다음은 현재 GET 요청 http://localhost:51910/api/tasks/1에 대한 응답입니다. 응답에는 우선 순위에 대한 링크 목록이 있지만 응답에 관련 이름 (예 : Low, Medium, High 등)이 없습니다.

WebApi.HAL을 사용하여 우선 순위의 이름을 얻는 데 가장 좋은 HAL 접근 방식은 무엇입니까?

참고 : 우선 순위 목록은 앞으로 강화 될 수 있습니다.

enter image description here

우선 순위

public class Priority 
{ 
    public int PriorityID { get; set; } 
    public string PriorityName { get; set; } 
    public string Revision { get; set; } 
    public DateTime ApprovalDate { get; set; } 
} 

컨트롤러

public class TasksController : ApiController 
    { 
     // GET api/values/5 
     [HttpGet] 
     public TaskRepresentation Get(int id) 
     { 

      Task selectedTask = TasksHelper.GetTask(id); 
      TaskRepresentation taskRepresentation = new TaskRepresentation(selectedTask); 
      return taskRepresentation; 
     } 

     //PUT For Setting Priority 
     [HttpPut] 
     [Route("api/tasks/{taskID}/priorities/{priorityID}")] 
     public TaskRepresentation PutSetPriority(int taskID, int priorityID) 
     { 
      Task selectedTask = TasksHelper.GetTask(taskID); 

      Priority selectedPriority = null; 
      List<Priority> allPriorities = TasksPrioritiesHelper.GetAllPriorities(); 
      foreach (Priority p in allPriorities) 
      { 
       if (p.PriorityID == priorityID) 
       { 
        selectedPriority = p; 
       } 
      } 

      //Update Task 
      if (selectedPriority != null) 
      { 
       selectedTask.CurrentPriority = selectedPriority.PriorityName; 
      } 
      else 
      { 

       throw new Exception("Not available"); 
      } 


      TaskRepresentation taskRepresentation = new TaskRepresentation(selectedTask); 
      return taskRepresentation; 
     } 

     [HttpGet] 
     [Route("api/tasks/{taskID}/priorities/{priorityID}")] 
     public Priority Get(int taskID, int priorityID) 
     { 
      Priority selectedPriority = null; 
      List<Priority> allPriorities = TasksPrioritiesHelper.GetAllPriorities(); 
      foreach (Priority p in allPriorities) 
      { 
       if (p.PriorityID == priorityID) 
       { 
        selectedPriority = p; 
       } 
      } 

      return selectedPriority; 
     } 

    } 

HAL 세대 관련 클래스

public static class LinkTemplates 
    { 

     public static class TaskLinks 
     { 
      public static Link TaskEntry { get { return new Link("self", "~/api/tasks/{taskID}"); } } 
      public static Link PriorityLink { get { return new Link("priorities", "~/api/tasks/{taskID}/priorities/{priorityID}"); } } 
     } 
    } 

public class TaskRepresentation : Representation 
    { 
     Task theTask; 

     public int TaskID{get{return theTask.TaskID;}} 
     public string TaskName{get{return theTask.Name;}} 
     public string CurrentPriority{get{return theTask.CurrentPriority;}} 
     public string Category{get{return theTask.Category;}} 

     public TaskRepresentation(Task t) 
     { 
      theTask = t; 
     } 


     public override string Rel 
     { 
      get { return LinkTemplates.TaskLinks.TaskEntry.Rel; } 
      set { } 
     } 

     public override string Href 
     { 
      get { return LinkTemplates.TaskLinks.TaskEntry.CreateLink(new { taskID = theTask.TaskID }).Href; } 
      set { } 
     } 


     protected override void CreateHypermedia() 
     { 
      foreach (Priority p in theTask.PossiblePriorities) 
      { 
       Links.Add(LinkTemplates.TaskLinks.PriorityLink.CreateLink(new { taskID = theTask.TaskID, priorityID = p.PriorityID })); 
      } 
     } 
    } 

답변

0

HAL 사양은 title입니다. 이는 요구 사항을 충족합니다.

다음은 업데이트 된 응답입니다.

{ 
    "TaskID": 1, 
    "TaskName": "Task1", 
    "CurrentPriority": "Medium", 
    "Category": "IT", 
    "_links": { 
    "self": { 
     "href": "/api/tasks/1" 
    }, 
    "priorities": [ 
     { 
     "href": "/api/tasks/1/priorities/101", 
     "title": "Low" 
     }, 
     { 
     "href": "/api/tasks/1/priorities/103", 
     "title": "High" 
     }, 
     { 
     "href": "/api/tasks/1/priorities/104", 
     "title": "Critical" 
     } 
    ] 
    } 
} 

WebAPI.HAL는 변경

protected override void CreateHypermedia() 
     { 
      foreach (Priority p in theTask.PossiblePriorities) 
      { 
       Link lnk = LinkTemplates.TaskLinks.PriorityLink.CreateLink(new { taskID = theTask.TaskID, priorityID = p.PriorityID }); 
       lnk.Title = p.PriorityName; 
       Links.Add(lnk); 
      } 
     } 

코드

public static class LinkTemplates 
    { 

     public static class TaskLinks 
     { 
      public static Link TaskEntry { get { return new Link("self", "~/api/tasks/{taskID}"); } } 
      //public static Link PriorityLink { get { return new Link("priorities", "~/api/tasks/{taskID}/priorities/{priorityID}"); } } 
      public static Link PriorityLink 
      { 
       get 
       { 
        Link l = new Link("priorities", "~/api/tasks/{taskID}/priorities/{priorityID}"); 
        return l; 
       } 
      } 
     } 
    } 


    public class TasksController : ApiController 
    { 
     // GET api/values/5 
     [HttpGet] 
     public TaskRepresentation Get(int id) 
     { 

      Task selectedTask = TasksHelper.GetTask(id); 
      TaskRepresentation taskRepresentation = new TaskRepresentation(selectedTask); 
      return taskRepresentation; 
     } 

     //PUT For Setting Priority 
     [HttpPut] 
     [Route("api/tasks/{taskID}/priorities/{priorityID}")] 
     public TaskRepresentation PutSetPriority(int taskID, int priorityID) 
     { 
      Task selectedTask = TasksHelper.GetTask(taskID); 

      Priority selectedPriority = null; 
      List<Priority> allPriorities = TasksPrioritiesHelper.GetAllPriorities(); 
      foreach (Priority p in allPriorities) 
      { 
       if (p.PriorityID == priorityID) 
       { 
        selectedPriority = p; 
       } 
      } 

      //Update Task 
      if (selectedPriority != null) 
      { 
       selectedTask.CurrentPriority = selectedPriority.PriorityName; 
      } 
      else 
      { 

       throw new Exception("Not available"); 
      } 


      TaskRepresentation taskRepresentation = new TaskRepresentation(selectedTask); 
      return taskRepresentation; 
     } 

     [HttpGet] 
     [Route("api/tasks/{taskID}/priorities/{priorityID}")] 
     public Priority Get(int taskID, int priorityID) 
     { 
      Priority selectedPriority = null; 
      List<Priority> allPriorities = TasksPrioritiesHelper.GetAllPriorities(); 
      foreach (Priority p in allPriorities) 
      { 
       if (p.PriorityID == priorityID) 
       { 
        selectedPriority = p; 
       } 
      } 

      return selectedPriority; 
     } 

    } 

    public class TaskRepresentation : Representation 
    { 
     Task theTask; 

     public int TaskID{get{return theTask.TaskID;}} 
     public string TaskName{get{return theTask.Name;}} 
     public string CurrentPriority{get{return theTask.CurrentPriority;}} 
     public string Category{get{return theTask.Category;}} 

     public TaskRepresentation(Task t) 
     { 
      theTask = t; 
     } 


     public override string Rel 
     { 
      get { return LinkTemplates.TaskLinks.TaskEntry.Rel; } 
      set { } 
     } 

     public override string Href 
     { 
      get { return LinkTemplates.TaskLinks.TaskEntry.CreateLink(new { taskID = theTask.TaskID }).Href; } 
      set { } 
     } 


     protected override void CreateHypermedia() 
     { 
      foreach (Priority p in theTask.PossiblePriorities) 
      { 
       Link lnk = LinkTemplates.TaskLinks.PriorityLink.CreateLink(new { taskID = theTask.TaskID, priorityID = p.PriorityID }); 
       lnk.Title = p.PriorityName; 
       Links.Add(lnk); 
      } 
     } 
    } 

    public class Task 
    { 
     public string Name { get; set; } 
     public int TaskID { get; set; } 
     public string Category { get; set; } 
     public string CurrentPriority { get; set; } 
     public List<Priority> PossiblePriorities { get; set; } 
    } 
    public class Priority 
    { 
     public int PriorityID { get; set; } 
     public string PriorityName { get; set; } 
     public string Revision { get; set; } 
     public DateTime ApprovalDate { get; set; } 
    } 

    public static class TasksPrioritiesHelper 
    { 

     public static List<Priority> GetAllPriorities() 
     { 
      List<Priority> possiblePriorities = new List<Priority>(); 
      Priority pLow = new Priority { PriorityID = 101, PriorityName = "Low" }; 
      Priority pMedium = new Priority { PriorityID = 102, PriorityName = "Medium" }; 
      Priority pHigh = new Priority { PriorityID = 103, PriorityName = "High" }; 
      Priority pCritical = new Priority { PriorityID = 104, PriorityName = "Critical" }; 

      possiblePriorities.Add(pLow); 
      possiblePriorities.Add(pMedium); 
      possiblePriorities.Add(pHigh); 
      possiblePriorities.Add(pCritical); 

      return possiblePriorities; 
     } 

     public static List<Priority> GetAdministrativePriorities() 
     { 
      List<Priority> possiblePriorities = new List<Priority>(); 
      Priority pLow = new Priority { PriorityID = 101, PriorityName = "Low" }; 
      Priority pHigh = new Priority { PriorityID = 103, PriorityName = "High" }; 

      possiblePriorities.Add(pLow); 
      possiblePriorities.Add(pHigh); 

      return possiblePriorities; 
     } 


     public static List<Priority> GetPossiblePrioritiesForTask(Task t) 
     { 
      List<Priority> possibleTaskPriorities = new List<Priority>(); 


      if (String.Equals(t.Category, "IT")) 
      { 
       possibleTaskPriorities = GetAllPriorities(); 
      } 
      else 
      { 
       possibleTaskPriorities = GetAdministrativePriorities(); 
      } 

      Priority currentTaskPriority = null; 
      foreach(Priority p in possibleTaskPriorities) 
      { 
       if(String.Equals(t.CurrentPriority,p.PriorityName)) 
       { 
        currentTaskPriority=p; 
       } 
      } 

      if(currentTaskPriority!=null) 
      { 
       possibleTaskPriorities.Remove(currentTaskPriority); 
      } 


      return possibleTaskPriorities; 
     } 


    } 
    public static class TasksHelper 
    { 
     public static Task GetTask(int id) 
     { 
      Task selectedTask = null; 
      List<Task> tasks = GetAllTasks(); 

      foreach (Task t in tasks) 
      { 
       if(t.TaskID==id) 
       { 
        selectedTask = t; 
       } 
      } 
      return selectedTask; 
     } 


     public static List<Task> GetAllTasks() 
     { 

      List<Task> tasks; 
      tasks = new List<Task>(); 

      Task t1 = new Task{Category = "IT",CurrentPriority = "Medium",Name = "Task1",TaskID = 1}; 
      t1.PossiblePriorities = TasksPrioritiesHelper.GetPossiblePrioritiesForTask(t1); 

      tasks.Add(t1); 

      return tasks; 
     } 


    } 
관련 문제