多个资源的 REST 接口使用

2024-04-25

我目前正在通过 http 添加 REST API 到在线服务,我遇到了一个非常简单的问题,我找不到令我满意的答案:

我主要有 2 个资源:“用户”和“报告”,正如您所猜测的那样,报告与用户相关联(与一个且仅一个,=我的数据库中的外键)

不管怎样,我有这个 url 映射GET :

  • mywebsite/api/users/{id}:返回用户及相关信息,如果 id 不存在则返回用户列表
  • mywebsite/api/report/{id}:返回报告和相关信息,如果 id 不存在,则返回报告列表

现在我想获取特定用户的报告,我现在的做法是向GET报告方法:?username={username}如果存在,我将过滤结果以仅返回该用户的报告。

我忍不住认为有些事情是错误的......如果我开始做这样的事情,我将有我的方法处理GET充满了 if/else 寻找缺失的参数...

我想到的其他解决方案是:

  • 将报告纳入结果中GET on mywebsite/api/users/{id}但我有很多很多的报告,所以最终它会变得非常糟糕......
  • 专门为此功能映射另一个网址,但感觉不太对......

我刚刚掌握了 REST 的概念,我喜欢这个概念,但对这个问题的一些解释确实可以帮助我更好地理解它。

Thanks

Edit:

看来我遇到了 REST 世界中的一个常见问题,我将我的资源与模型绑定在一起。如果将资源与模型绑定,您最终会在聚合属性方面遇到麻烦。 有人在这里描述了这个错误http://jacobian.org/writing/rest-worst-practices/ http://jacobian.org/writing/rest-worst-practices/但我还不明白如何按照他所说的那样进行管理......

仅供参考,我正在使用 django/piston,但无论任何语言如何,这个问题都应该可以回答。


我不禁觉得有些不对劲……

您做错的唯一一件事是认为您的 URI 结构使您的应用程序或多或少是 RESTful 的。这原始 REST 文献 http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm从来没有说查询字符串不好。人们往往对 URI 结构很着迷,并且似乎认为您的 URI 必须以某种方式构建才能被视为 RESTful。使用起来没有什么问题?username=<username>. URI 只是一个 ID (尽管有些可能比其他的更人性化).

底线:不要纠结于你的 URI 如何look。还有很多更重要的事情需要关注(促进超链接/超媒体、坚持统一的接口 - 通常是 HTTP、可缓存性等)。

这可能是一个很大的题外话,但是,至于您对资源与模型耦合的评论,您仍然没问题。如果您确实选择了 /reports/ID/user 路线,只需将“user”视为报告模型上的关系名称即可。当然,您的模型定义了报表和用户之间的关系。您可以只解析 URI 的最后部分,使其与此关系的名称匹配。在像您描述的一对一关系的情况下,设置内容-位置 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.14标头以匹配用户的规范 URI。

例如。假设报告 123 属于用户 1。现在您有两种方式引用该用户:

http://example.com/reports/123/user
http://example.com/user/1

对于第一个 URI,设置也是一个好主意Content-Location: http://example.com/user/1 header

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

多个资源的 REST 接口使用 的相关文章

  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • 如何使用 Trie 进行拼写检查

    我有一个根据单词词典构建的特里树 我想用它来进行拼写检查 并建议字典中最接近的匹配项 也许对于给定数量的编辑x 我想我会在目标单词和字典中的单词之间使用 levenshtein 距离 但是有没有一种聪明的方法可以遍历 trie 而不需要对每
  • 使用 Jinja2 模板在 HTML 文本区域中显示 FastAPI 响应(元组)

    这是我的 FastAPI 后端 main py from typing import Optional from fastapi import FastAPI Request Form from fastapi templating imp
  • gradle - 从 url 下载并解压文件

    从 url 下载和解压文件的正确 gradle 方法是什么 http 如果可能的话 我想防止每次运行任务时重新下载 在ant get可以通过以下方式实现skipexisting true 我当前的解决方案是 task foo ant get
  • Jersey REST/ JAXB 错误,映射接口

    我必须使用 REST Web 服务中的接口 这是接口 Specs java XmlJavaTypeAdapter MyAdapter class public interface Specs public BaseProperties ge
  • REST Web 服务 - 动态查询参数

    我需要将动态查询参数发送到 REST Web 服务 GET 方法 如下所示 主机 端口 应用程序 field1 XXX value1 VVV field2 XXX value2 XXX 消费者可以发送参数最多为字段和值 每个字段都映射到值
  • 我应该如何处理 Android 应用程序中 http post 的服务器超时和错误代码响应?

    我的 Android 应用程序会向 URL 发送 http 帖子 例如http example com 电子邮件受保护 http example com abc php email abc xyz com因此 Android 应用程序基本上
  • 有效地将相似的数字分组在一起[重复]

    这个问题在这里已经有答案了 可能的重复 一维数数组聚类 https stackoverflow com questions 11513484 1d number array clustering 我有一个数字数组 例如 1 20 300 4
  • Google 文件系统中的块大小问题

    谷歌文件系统论文 http labs google com papers gfs html 块大小是关键设计之一 参数 我们选择了64MB 这比典型文件大得多 系统块大小 每个块 副本存储为普通 Linux 文件放在 chunkserver
  • 如何使PHP库松耦合? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无扫描器解析器生成器

    序幕 尽管解析器 上下文无关语法 识别的语言集严格大于扫描器 常规语法 识别的语言集 但大多数解析器生成器都需要扫描器 请不要试图解释其背后的原因 我很了解它们 我见过解析器 不需要像这样的扫描仪 Elkhound http scottmc
  • htaccess 重定向非 www http 和 https

    我想要 http example com重定向至 http www example com https example com重定向至 https www example com 以及任何东西http whatever example co
  • 独立于符号的字符串的模式匹配

    我需要一种算法 可以在数据中找到预定义的模式 以字符串的形式存在 独立于数据和模式的实际符号 字符 我只关心符号之间的关系 而不关心符号本身 数据中的同一符号具有不同的模式符号也是合法的 模式匹配算法必须强制执行的唯一一件事是保留模式中同一
  • 使用PHP获取http url参数而不自动解码

    我有一个像这样的网址 test php x hello world y 00h 00e 00l 00l 00o 当我将它写入文件时 file put contents x txt GET x gt hello world file put
  • 处理原始 HTTP 请求内容

    我正在 ASP NET 中做一个电子商务解决方案 它使用PayPal 网站支付标准 https www paypal com IntegrationCenter ic standard home html服务 除此之外 我还使用他们提供的服
  • Http Auth 不适用于 PHP

    我使用 Laravel Lumen Shield 扩展进行 Http 身份验证 但是在我的本地计算机上一切都很完美 我只在我们的服务器上遇到了问题 问题是在我提交正确的登录数据后 登录屏幕再次出现 我尝试了不同的登录数据 不同的浏览器 登录
  • Angular 显示每个 HTTP 请求的微调器,只需很少的代码更改

    我正在开发一个现有的 Angular 应用程序 版本是 Angular 4 该应用程序从许多不同的组件对 REST API 进行 HTTP 调用 我想为每个 HTTP 请求显示一个自定义微调器 由于这是一个现有的应用程序 因此有很多地方调用
  • 您可以在分块的 http 响应预告片中设置 Location 标头吗?

    HTTP 1 1 响应可以分块 spec https www rfc editor org rfc rfc2616 section 3 6 1 在最后一个块的末尾 服务器可以发送一个 预告片 其中包含附加标头 问题是 你能包括一个Locat
  • Restful服务参数不匹配异常

    我有服务 POST Path post Consumes application json public Response createProductInJSON Product product String result Product

随机推荐

  • 用于 Tortoise 客户端的 Windows Subversion 服务器 (SVN)

    我的问题是这样的 在 Windows 上使用的 Subversion Server https stackoverflow com questions 615866 subversion server to use on windows 唯
  • HTML5 音频标签 - 开始和结束位置

    我有多个
  • NHibernate 中的有序多对多关系

    假设我有两个类 Item 和 ItemCollection 其中 ItemCollection 包含一个ordered具有索引的 Item 对象列表 即列表按用户指定的方式排序 我们还假设它们具有多对多关系 一个 ItemCollectio
  • 如何获取.Net(VB或C#)中参数化查询实际执行的SQL?

    是否有一种直接的方法来查看实际对底层数据库执行的 SQL 命令文本DbCommand对象 即在参数被处理成语句之后 这里是详细信息 我正在使用 VB Net 3 5 并有一个工厂对象 DbProviderFactory 和一个连接 Syst
  • 分割多重多边形

    我可以直接取出零件并把它们取出来作为它们自己的功能吗 或者这会涉及更复杂的东西吗 我正在尝试将其中一张地图拆分为较小的部分以对它们进行索引 https github com simonepri geo maps https github c
  • 如何使用 boost::serialization 序列化 std::vector ?

    class workflow private friend class boost serialization access template
  • Knockout :找出哪个可观察触发了计算

    我有一个具有多个可观察值的对象 计算中有没有一种方法可以知道哪些可观察的变化 从而知道哪个可观察触发了计算 先感谢您 马修 如果没有详细说明您想要实现的目标 我将发布此内容 希望它能有所帮助 跟踪更改的一个简单方法是使用 subscribe
  • 冲出地图

    所以我遇到这个问题 如果数组中的值高于输入的值 它应该执行某些操作 然后停止循环并且不要触及数组中的剩余值 这是到目前为止的代码 const percentages let enteredValue parseInt event targe
  • 更改 ggplot2 中的 Y 轴分隔符

    我有这段代码可以给出如下所示的图表 d ggplot df aes x Year y NAO Index width 8 geom bar stat identity aes fill NAO Index gt 0 position ide
  • Google 地图 v3 API - 自动完成(地址)

    尝试让我的谷歌地图应用程序自动完成工作 这是当前的代码 HTML
  • ScrollLeft() 不适用于 Firefox

    我这里有一个 jsfiddle http jsfiddle net stevea DyfGp 2 http jsfiddle net stevea DyfGp 2 其中外框包含延伸到视口之外的内框 这会强制出现水平滚动条 一个 向左走 Sc
  • Git 推送失败(Github/RStudio)

    我过去曾在这台机器上成功使用过 Git 但突然间我无法再将我的提交推送到 Github 存储库 我对 Git 工具链所做的最后一次更改是除了 Windows 客户端的 Github 之外还安装了 Git 1 8 5 2 除非我已经启动了 G
  • 真正的C静态局部变量替换?

    只是试图在 ObjectPascal Delphi 中实现 C C 静态局部变量的类似功能 让我们在 C 中编写以下函数 bool update position int x int y static int dx pow 1 0 rand
  • VS Code 终端无法识别 PATH 变量

    我在 PATH 中添加了一个目录 但 VS Code 中的终端无法识别我尝试从该目录运行的命令 exe 终端使用 cmd 而不是 power shell 我缺少什么 重新启动我的计算机 它就工作了 显然 VS Code 无法识别这些更改
  • 为什么插入查询有时需要很长时间才能完成?

    这是一个非常简单的问题 将数据插入表中通常工作正常 除了少数情况下插入查询需要几秒钟的时间 我是not尝试批量插入数据 因此 我为插入过程设置了一个模拟 以找出为什么插入查询偶尔需要超过 2 秒才能运行 Joshua建议索引文件可能正在调整
  • iPhone 应用程序和 PayPal

    我想将 PayPal 支付功能集成到我的本机 iPhone 应用程序中 而不使用 Web 界面 这样用户就不必离开当前应用程序 怎么可能 我应该使用 SOAP XML 请求 响应机制吗 我通过以下链接来的http www slideshar
  • 如何在keycloak登录页面实现Recaptcha

    我想在 keycloak 登录页面 如注册页面 中实现 recaptcha 我用所需的工厂类扩展了 UsernamePasswordForm 类 我什至还开设了行动要求课程 但我仍然看不到在提供程序选项卡中添加登录 我也修改了现有的logi
  • 如何禁用 C++ 宏中的警告

    在 Visual C 中 您可以使用 pragma 暂时禁用警告 pragma warning suppress 4307 如何禁用宏内的警告 例如 当我导致如下所示的 积分常量溢出 警告时 define TIMES A MILLION x
  • android 旋转器的屏幕方向处理

    我有一个活动 其中有一个旋转器 因为对于纵向和横向模式我有不同的布局所以我正在改变布局onConfigurationChanged method Override public void onConfigurationChanged Con
  • 多个资源的 REST 接口使用

    我目前正在通过 http 添加 REST API 到在线服务 我遇到了一个非常简单的问题 我找不到令我满意的答案 我主要有 2 个资源 用户 和 报告 正如您所猜测的那样 报告与用户相关联 与一个且仅一个 我的数据库中的外键 不管怎样 我有