c# - 超媒体与 Servicestack 新 API 的链接

标签 c# rest servicestack

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

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

添加 List 对我来说没问题,但我的疑虑是将以下链接的逻辑放在哪里(在服务中还是保存状态机的专用类中?)以及在哪里解析路由(过滤器?)

谢谢。

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

最佳答案

我目前的做法是传回一个实现接口(interface)的响应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 并使用链接填充响应 header 。

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 属性。)

希望对您有所帮助。

关于c# - 超媒体与 Servicestack 新 API 的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18351944/

相关文章:

http - 如何为从 ServiceStack 的虚拟文件系统下载的文件添加 header ?

c# - 路由中具有相同键的多个值

c# - 在插件中注册服务前缀 - ServiceStack

java - 用于公开 Neo4j 节点的 REST 接口(interface)实现

java - 如何检测方法发布中同一时间的重复请求

c# - 使用 MVC、C# 和 jQuery 导出为 CSV

c# - 什么是 C# 5,它来自哪里?

c# - 如何测试对象是否被处置和 GC'ed?

c# - Directory.GetFiles searchPattern 与文档不一致

java - 带有 gradle 的 Jersey 测试框架 - MessageBodyProviderNotFound