【问题标题】:Generating Hypermedia links in a Web API在 Web API 中生成超媒体链接
【发布时间】:2012-08-30 16:30:49
【问题描述】:

我很想知道其他人是如何处理为他们的 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 中各种操作的修饰属性?

【问题讨论】:

  • 附录:我已经阅读了 Glenn Block 关于 Web API 中超媒体 (codebetter.com/glennblock/2012/01/08/…) 的帖子,虽然他似乎更喜欢在运行中生成链接(类似于上面的示例 1),但我觉得就像他在结尾提到的“中间件”路线感觉更自然。
  • 看看 ammy 在 teched newzealand channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305 的演示文稿,她的解决方案很有希望用于带有 web api 的超媒体,也可以看看这里的 github 示例代码

标签: c# asp.net-web-api hateoas hypermedia


【解决方案1】:

我已经添加了我的解决方案here

它使用类和属性属性以及 ApiController 扩展方法来填充您的实体中的 ResourceLink 对象。它还可以填充任何集合属性的链接。这不是完成的文章,但它非常直观,将是一个良好的开端。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我更喜欢选项二(稍后在管道中添加超媒体链接)和blogged about doing this yesterday

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

      【讨论】:

      • 这真的很酷,谢谢分享。我们使用了扩展方法,并且在 action 方法中占 1 行代码的更多的是千篇一律的代码。我喜欢你有被返回的资源,并且可以根据上下文添加或不添加超媒体。
      【解决方案4】:

      您可以使用来自 github 的 Hyprlinkr

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

      【讨论】:

      • 因此,Hyprlinkr 是实际生成链接的一个很好的解决方案——当您知道要生成哪些链接时。我的问题更多是围绕“我如何知道我需要生成哪些链接”,而不是“我应该如何生成它们?”无论哪种方式,一旦您进入“如何”部分,超链接确实可以帮助解决问题。
      猜你喜欢
      • 2013-08-23
      • 2013-05-11
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多