超媒体与 Servicestack 新 API 链接

2023-11-26

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

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

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

Thanks.

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


我目前执行此操作的方法是传回一个实现接口的响应 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; }

  // ...
}

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

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超媒体与 Servicestack 新 API 链接 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Java中如何比较两个时刻?

    我想要对比二Instants 查看是否等于或大于 但我不能 我不知道 我如何比较瞬间 private Instant expiration if expiration Instant now expiration gt Instant no
  • 没有大括号的 JavaScript if 语句的简洁语法

    务实地说 我对我正在寻找的东西有一个快速而肮脏的答案here 但为什么使用它不是一个好主意呢 为什么我找不到它的正式文档 它不是规范和标准的一部分吗 不是得到广泛支持吗 仅仅是因为缩小可能会破坏使用该语法的代码吗 如果您能给我提供有关该功能
  • 如何在AWS S3中上传Image Buffer数据?

    我正在尝试将缓冲区数据从图像上传到 S3 它上传得很好 但是当我尝试在 S3 中下载 查看图像时 它会抛出错误 我尝试过以下方法 我可以使用缓冲区格式 JSON 获取该图像 我无法改变这一点 let image type Buffer da
  • 如何从 Windows 任务管理器(“应用程序”选项卡)获取应用程序及其在 Delphi 硬盘上的位置

    我想获取在 Windows 任务管理器的 应用程序 选项卡 不是 进程 选项卡 中运行和可见的程序列表 并获取它们在 HDD 上的位置 我需要在 Delphi 中完成它 有人可以帮忙吗 据我所知 任务管理器中的 应用程序 选项卡是顶级窗口的
  • 为 DataContractSerializer 预定义 XML 命名空间

    我正在构建一个自托管的 WCF 服务 我正在构建一个特殊的数据结构 以实现非常灵活的数据传输 到目前为止 我测试了我的结构是否可以使用 DataContractSerializer 进行序列化 这工作得很好 我对此很高兴 但有一些事情让我烦
  • 如何将用户定义的对象插入STL集中?

    我正在尝试将对象 Point2D 插入 Point2D 集合中 但我无法做到这一点 该集合似乎适用于 int 和 char 但不适用于对象 我需要帮助来了解如何将对象插入集合中 假设我想按 x 值的升序对它们进行排序 class Point
  • 在 xamarin.ios 中使用 LaunchScreen.storyboard 添加启动图像

    我正在 Xamarin ios 上工作并使用 Visual Studio 进行开发 我添加了 LaunchScreen Storyboard 来显示启动图像 因为我也想瞄准新的 iPhoneX 设备 我当前面临的问题是 我无法在设备或模拟器
  • 如何禁用几行代码的 GCC 警告

    在 Visual C 中 可以使用 pragma warning disable 我还发现在海湾合作委员会你可以覆盖每个文件编译器标志 我该如何为 下一行 执行此操作 或者使用 GCC 在代码区域周围使用推送 弹出语义 看来这个可以做到 我
  • lambda 内的 lambda

    只是为了好奇 几天前发现了 Lambda 我只是想知道是否可以做类似的事情 尝试过解释 但我的尝试似乎都不起作用 p lambda x lambda x x 2 2 没有明确的目的 我只是没有找到满意的答案 我可能误解了 Lambda 您可
  • 使用 DOM 循环遍历“body”标签的所有元素

    html file get contents test html doc new DOMDocument doc gt loadHTML html xpath new DOMXPath doc body xpath gt query bod
  • 图/网络数据结构的 Java API 列表

    有哪些好的 Java API 可将图形 边 节点 用作数据结构 请在本 wiki 的评论中添加对类似 SO 问题的引用 请直接编辑此 wiki 条目中的列表 请添加您添加的项目的摘要描述作为答案 每个答案一个项目 为了我的硕士论文 我在网上
  • 图表中的微笑

    是否有一种方法或包可以将图 或邻接矩阵 转换为 SMILES 字符串 例如 我知道原子是 6 6 7 6 6 6 6 8 C C N C C C C O 邻接矩阵是 0 1 0 0 0 0 0 0 1 0 2 0 0 0 0 1 0 2 0
  • 我创建的类可以自动装箱吗?

    有什么方法可以对我创建的类使用自动装箱吗 例如 我有这个子类Number public class UnsignedInteger extends Number int n public UnsignedInteger int n if n
  • 在活动之间共享域对象

    我已经在域对象中编写了应用程序逻辑 以启用多个用户界面并移植到其他平台 现在正在考虑为用户界面实现活动 考虑到每个活动都需要序列化其状态 确保我的域对象仅序列化一次的最佳方法是什么 如果您正在谈论序列化对象以在活动之间共享它们 您应该创建自
  • 导入项目出现无法解析目标“android-7”

    这个应用程序是我大约一年前完成的 但从未在市场上发布过 我现在尝试在 Eclipse 中打开它 进行一些小的修改并对代码进行一些处理 所以我导入了它 然后发现了这个奇怪的 无法解析目标 错误 它在我所有的 src 文件中突出显示了每个类的红
  • 为什么我无法使用 Type.InvokeMember 检索 out 或 ref 类型的参数值?

    标题很长 但我希望它具体一些 标题确实是个问题 尽管该方法InvokeMember正在呼叫有一个out参数并正在为该参数分配一个值 但我无法获取该值 这是我最初使用的代码 string parameter int result Conver
  • IE9 中的条件样式表

    IE9 应该支持条件注释 我有正确的 MIME 类型 type text css 所有其他条件样式表都被读入正确的浏览器 这是我无法阅读的内容 它与其他部分一起位于 head 中 但在 IE9 中不会出现在 head 中 对于愚蠢的问题感到
  • 使用 Firebase,Swift removeObserver(withHandle 不会删除观察者

    使用 Swift 3 中的removeObserver withHandle 观察者不会在 viewDidDisappear 上删除 var query FIRDatabaseQuery var postRef FIRDatabaseRef
  • Rails:模型实例方法还是辅助方法?

    按照惯例 以下内容应该定义为我的模型的实例方法还是辅助方法 app models user rb class User lt ActiveRecord Base def full name first name last name end
  • 超媒体与 Servicestack 新 API 链接

    我正在评估如何向 DTO 响应添加超媒体链接 虽然没有标准 但将 List 添加到响应 DTO 似乎是建议的方法 您知道使用ServiceStack框架实现的示例或参考吗 添加列表对我来说没问题 但我的疑问是在哪里放置以下链接的逻辑 在服务