【问题标题】:Hypermedia links with Servicestack new API与 Servicestack 新 API 的超媒体链接
【发布时间】:2013-08-23 12:02:02
【问题描述】:

我正在评估如何将超媒体链接添加到 DTO 响应。虽然没有标准,但是在响应 DTO 中添加 List 似乎是suggested approach

您知道使用 ServiceStack 框架实现的任何示例或参考吗?

添加列表对我来说是可以的,但我的疑问是在哪里放置以下链接的逻辑(在服务中或保存状态机的专门类中?)以及在哪里解决路由(过滤器?)

谢谢。

[更新] 从ServiceStack v3.9.62版本开始可以通过EndpointHost.Config.Metadata.Routes.RestPath来访问Routes配置,所以tgmdbm提供的解决方案可以在不需要“IReturn + Routes属性”的情况下进行改进",仅使用 Metadata.Routes 信息。 事实上,所有服务元数据都可以被查询并用于横切关注点。服务堆栈摇滚。

【问题讨论】:

    标签: c# rest servicestack


    【解决方案1】:

    我目前这样做的方式是返回一个实现接口的响应 dto

    public interface IHaveLinks
    {
      [IgnoreDataMember]
      IEnumerable<Link> Links { get; }
    }
    
    public class Link
    {
      public string Name { get; set; }
      public IReturn Request { get; set; }
      public string Method { get; set; }
    }
    

    然后我使用响应过滤器生成 url 并使用链接填充响应标头。

    this.ResponseFilters.Add((req, res, dto) =>
    {
      if (!(dto is IHaveLinks))
        return;
    
      var links = (dto as IHaveLinks).Links
    
      if(links == null || !links.Any())
        return;
    
      var linksText = links
        .Select(x => string.Format("<{0}>; rel={1}"), x.Request.ToUrl(x.Method), x.Name));
    
      var linkHeader = string.Join(", ", linksText);
    
      res.AddHeader("Link", linkHeader);
    });
    

    这似乎是最干净的方式。上面的Link 对象有效地表示“如果您使用此方法发出此请求,您将取回指定的资源”。唯一影响 BLL 的 HTTP 内容是 Method。但是你可以摆脱它,只传回 GET url。或者将其映射到一些广义的“操作”?

    举个例子:

    public class ExampleService : Service
    {
      public ExamplesResponse Get(ExamplesRequest request)
      {
        var page = request.Page;
        var data = // get data;
    
        return new ExamplesResponse
          {
            Examples = data,
            Links = new []
              {
                new Link { Name = "next", Request = request.AddPage(1), Method = "GET" },
                new Link { Name = "previous", Request = request.AddPage(-1), Method = "GET" },
              }
          }
      }
    }
    
    [Route("/examples/{Page}")]
    public class ExamplesRequest : IReturn<ExamplesResponse>
    {
      public int Page { get; set; }
    
      // ...
    }
    

    AddPage 方法返回请求的克隆并适当地设置 Page 属性。)

    希望对您有所帮助。

    【讨论】:

    • 谢谢,是符合Servicestack框架的好方案。与 BLL 相关,我认为问题出在框架本身。如果它对 Routes 有更开放的访问权限,那么使用该 Map 进行反向路由会更容易,并且它可能会避免所有基础设施代码(IReturn + Route 属性)
    • 是的,ToUrl 方法是魔法发生的地方,不幸的是,它需要请求 dto 来实现 IReturn 并具有 Route 属性。
    猜你喜欢
    • 2013-12-05
    • 2013-05-11
    • 2012-08-30
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2014-12-30
    • 2018-05-20
    • 2016-12-06
    相关资源
    最近更新 更多