超媒体链接Servicestack新API

jru*_*ren 7 c# rest servicestack

我正在评估如何向DTO响应添加超媒体链接.虽然没有标准,但在响应中添加List DTO似乎是建议的方法.

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

添加列表对我来说没问题,但我的疑问是关于在哪里放置以下链接的逻辑(在服务或包含状态机的专用类中?)以及解决路由的位置(过滤器?)

谢谢.

[更新]从ServiceStack版本v3.9.62开始,它可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此tgmdbm提供的解决方案可以在不需要"IReturn + Routes属性" 的情况下得到改进,只需使用元数据.Routes信息.实际上,可以查询所有服务元数据并将其用于横切关注点.Servicestack岩石.

tgm*_*dbm 9

我这样做的方式是我传回一个实现接口的响应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; }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用响应过滤器生成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);
});
Run Code Online (Sandbox Code Playgroud)

这似乎是最干净的方式.Link上面的对象有效地说:"如果使用此方法发出此请求,您将获得指定的资源".唯一出现在BLL上的HTTP就是Method.但你可以摆脱它,只能传回GET网址.或者将它映射到一些广义的"操作"?

举个例子:

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; }

  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.