2016-08-10 117 views
0

我正在为项目任务创建一个API。它有一个TasksController如下所列。我使用WebApi.Hal生成超媒体,服务支持hal+jsonhal+xml也是media types如何获取HAL中链接资源的关联名称

以下是我目前对GET请求http://localhost:51910/api/tasks/1的回复。在响应中有一个优先级链接列表 - 但它们在响应中没有关联名称(在UI中显示 - 例如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; 
     } 


    }