22

我很想知道其他人如何处理为他们的 Web API 生成超媒体链接的问题?具体来说,我正在使用 ASP.NET Web API,并且在让操作返回与超媒体相关的类型或返回资源本身以及让超媒体内容在管道中稍后发生之间左右为难。也就是说,人们是否倾向于做以下事情:

public Resource<Order> GetOrder(int id) { 
  return new Resource<Order>() {
      Content = new Order(),
      Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()}
  }

或者更像

public Order GetOrder(int id) { return new Order(); }

然后在 HttpOperationHandler 或自定义格式化程序或其他东西中添加超媒体链接?

如果方法更像#2,你怎么知道要生成什么链接?只是有一些为所有 Order 对象生成的标准链接集?在 OrdersController 中装饰各种操作的属性?

4

4 回答 4

25

我更喜欢选项二(稍后在管道中添加超媒体链接)并在昨天发表了关于这样做的博客

解决方案是在使用消息处理程序将它们返回给客户端之前,使用超媒体链接“丰富”我的资源。

于 2012-09-06T07:32:45.533 回答
9

您可以使用来自github的 Hyprlinkr

我计划在我的下一个项目中使用它,因为它看起来很好而且很容易做到,你可以通过 nuget 包获得它。

于 2012-09-06T01:43:32.830 回答
2

在回答这个问题时,看看 ASP.NET MVC 方法来处理这个问题是有启发性的,因为 ASP.NET MVC可能被视为 Web API 的文本/html 约束版本(尽管有手动内容协商),并且因为它显然严重影响了 Web API 的设计。

基本上,我们可以使用自定义格式化程序根据路由或操作属性来改变表示。这是通过 ASP.NET MVC 将视图与模型分离的方式来实现的。在 ASP.NET MVC 项目中,单个模型可以由各种视图模板呈现。这些视图模板中的每一个基本上都将过渡链接(锚、表单和链接元素)“硬编码”到模型的特定表示中。视图模板的选择主要由约定(控制器和动作名称)驱动,但也可以在动作中硬编码。

ASP.NET MVC 中的视图引擎和视图查找约定可以被视为自定义 Web API 格式化程序。这可以概括为,对于每种支持的媒体类型,自定义格式化程序使用路由详细信息 - 以及可选的应用于调用的操作方法的属性 - 来定义资源状态。(根据这个约定,选择反映资源状态的动作名称是有好处的。)一旦格式化程序知道资源的状态,它就可以委托给特定于状态的格式化代码。在此代码中,将定义特定于状态的链接。

这种特定于状态的格式化代码也可以委托给其他子格式化程序,就像 Razor 视图支持部分视图的组合一样。

于 2013-02-21T05:07:23.317 回答
1

我在这里添加了我的解决方案

It uses class and property attributes in combination with an ApiController extension method to populate a ResourceLink object in your entity. It can also populate links for any collection properties. It's not the finished article but it is quite intuitive and will make a good start.

于 2017-09-08T10:54:34.617 回答