过滤条件的查询字符串与资源路径

2024-06-18

背景

我有2个资源:courses and professors.

A course具有以下属性:

  • ID
  • topic
  • 学期号
  • 部分
  • 教授_id

A professor具有以下属性:

  • ID
  • 学院
  • 超级用户

所以,你可以说一门课程有一位教授,而一位教授可能有很多门课程。

如果我想获得所有课程或所有教授,我可以:GET /api/courses or GET /api/professors分别。


Quandary

当我想要获得某位教授教授的所有课程时,我的困境就出现了。

我可以使用以下任一方法:

  • GET /api/professors/:prof_id/courses
  • GET /api/courses?professor_id=:prof_id

我不确定该使用哪个。


目前的解决方案

目前,我正在使用后者的增强形式。我的理由是,如果我想添加过滤/排序标准,它更具可扩展性。

我实际上是将 JSON 字符串编码/嵌入到查询参数中。因此,(解码的)示例可能是:

GET /api/courses?where={professor_id: "teacher45", year: 2016}&order={attr: "topic", sort: "asc"}

上述请求将检索由提供的 Professor_id 的教授在 2016 年教授(或当前)教授的所有课程,并根据主题标题以 ASCII 升序排序。

我从来没有见过有人这样做,所以我想知道我是否在做一些愚蠢的事情。


结束语

是否有使用查询字符串与资源路径作为过滤条件的标准做法?过去一些较大的 API 做了什么?是否可以接受或鼓励同时使用这两种范例(使两个端点都可用)?如果我确实应该使用第二种范例,除了编码 JSON 之外,是否还有更好的组织方法?有人见过另一个在查询字符串中使用 JSON 的公共 API 吗?


编辑为较少基于意见。 (看评论)


正如之前的评论中已经解释的那样,REST 不太关心标识唯一资源的链接的实际形式,除非RESTful 约束 https://en.wikipedia.org/wiki/Representational_state_transfer或者违反了超文本传输​​协议 (HTTP) 本身。

关于查询或路径(甚至矩阵)参数的使用完全取决于您。有没有固定的规则 https://stackoverflow.com/questions/11552248/when-to-use-queryparam-vs-pathparam什么时候使用什么只是个人喜好。

我喜欢使用查询参数,尤其是当该值是可选的并且不需要像 JAX-RS 这样的大量框架时,即允许定义默认值。人们常说查询参数是为了避免缓存响应,但是与其说是事实,不如说是都市传说 http://www.bizcoder.com/caching-resources-with-query-strings,尽管某些实现可能仍然会忽略对包含查询字符串的 URI 进行缓存的响应。

如果参数定义了诸如特定风味属性(即汽车颜色)之类的东西,我更喜欢将它们放入矩阵参数中。它们也可以出现在 URI 的中间,即/api/professors;hair=grey/courses可以返回所有由头发颜色为灰色的教授开设的课程。

根据我的理解,路径参数是应用程序满足请求所需的强制参数,否则将不会首先在服务端调用相应的方法处理程序。通常这是一些资源标识符,例如分配给特定实体的表行 ID 或 UUID。

在描述关系时,我通常从 1:n 关系的 1 部分开始。如果我面对一种多对多的关系,就像你与教授的情况一样,我通常会从可能更容易存在的实体开始。即使教授不举办任何讲座(在特定术语中),他仍然是教授。如果没有教授,课程就不再是课程,所以我会把教授放在课程之前,尽管就 REST 而言,课程仍然是很好的顶级资源。

因此我会改变你的查询

GET /api/courses?where={professor_id: "teacher45", year: 2016}&order={attr: "topic", sort: "asc"}

像这样的东西:

GET /api/professors/teacher45/courses;year=2016?sort=asc&onField=topic

我稍微改变了你的字段的语义,因为年份属性可能更适合课程而不是教授资源,因为教授已经通过教授 ID 简化为单一资源。然而,这些课程应该仅限于 2016 年举办的课程。由于排序是相当可选的,并且可能指定了默认值,因此这是我放入查询参数部分的完美候选者。排序依据的字段与排序本身相关,因此也属于查询参数。我将年份放入矩阵参数中,因为这是课程本身的特定属性,例如汽车的颜色或汽车的制造年份。

但正如之前所解释的,这是相当固执己见的,可能与您或其他人的观点不符。

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

过滤条件的查询字符串与资源路径 的相关文章

随机推荐

  • Angular 2 RC 4“(SystemJS)无法解析[对象位置]的所有参数:”在 IE 11 中

    我的 Web 应用程序在 Chrome Firefox 和 Edge 中运行良好 但在 IE 11 中当然不行 旧版本的 IE 可能也没有 这是一个使用 Angular Cli 生成应用程序的最小应用程序 完整错误 EXCEPTION Ca
  • QuerySelectorAll 不适用于 onclick 事件

    Scenario 我有一些文本输入 我希望它们在单击时具有 500px 的宽度 My code var inputs document querySelectorAll input type text for i 0 i
  • 如何在不复制的情况下获取 std::stringstream 的长度

    如何获取字符串流的字节长度 stringstream str length 会将内容复制到 std string 中 我不想复印 或者 如果有人可以建议另一个在内存中工作的 iostream 可以通过写入另一个 ostream 并且可以轻松
  • Android-使用 ViewHolder 和 AsyncTask 加载联系人-缩略图问题

    我正在创建一个自定义联系人应用程序 我使用带有 ViewHolder 设计模式的 ArrayAdapter 进行优化 由于加载缩略图需要花费大量时间 因此我使用 AsyncTask 类来加载图像 用于第一组联系人我的屏幕上 图片加载得很好
  • 为大金刚风格游戏制作和使用 pygame 精灵

    对于我的项目 我正在 pygame 中重新创建大金刚 我已经到了需要为梯子 平台和角色提供精灵的阶段 但我不确定如何制作精灵 然后在 pygame 中使用它们 这是一个非常基本的使用示例Sprite在 pygame 中 另见Sprite h
  • 使用 API 8 及以上版本获取用户/所有者个人资料联系人 URI 和用户图像

    从 API 14 Android 4 0 起 开始我可以使用ContactsContract Profile CONTENT URI得到手机所有者的联系个人资料 Uri 并通过该信息获取他们的头像 联系照片 我想知道如何从 API 8 An
  • terraform 变量默认值从局部插值

    我有一个用例 我需要两个 AWS 提供商来提供不同的资源 默认aws提供程序在主模块中配置 该模块使用另一个定义附加模块的模块aws提供者 默认情况下 我希望两个提供商使用相同的 AWS 凭证 除非明确覆盖 我想我可以做这样的事情 在主模块
  • Java泛型中类型参数的前向引用

    根据 Java 泛型常见问题解答http www angelikalanger com GenericsFAQ FAQSections TypeParameters html FAQ302 http www angelikalanger c
  • Matplotlib:绘制从x轴到点的线

    我有很多点正在尝试使用 matplotlib 进行绘制 对于每个点 a b 我想在 0 b 中为 Y 绘制直线 X a 知道如何做到这一点吗 Use a stem plot 最不麻烦的解决方案采用matplotlib pyplot stem
  • 让两种口味使用相同的sourceSet

    我有两种风格 demo 和 full 每种风格都有自己的源集在 src demo 和 src full 中 这很好用 我现在想做第三种使用这些源集之一的风格 我该怎么做呢 我尝试过类似的东西 productFlavors full appl
  • nodeJS + Swig 模板将变量传递给 javascript

    有没有办法使用nodeJS的express swig模板将变量从服务器端传递到客户端javascript 我知道这可以在 Jade 中完成 但我宁愿坚持使用更类似于 HTML 的模板引擎 感谢各位的帮助 好的 我假设您可以使用 consol
  • (Emacs) 文本是只读的?

    所以我在 emacs 中工作 突然 slime repl sbcl 说文本是只读的 嗯 这很好 因为现在我无法在其中输入任何内容 我该如何修复 缓冲区是只读的 可以通过以下方式解决C x C q但正如德鲁和菲尔斯所说 文本是只读的 是非常不
  • 获取当前操作和控制器并将其用作 Html.ActionLink 中的变量?

    我需要能够动态检索您所在页面的当前操作和控制器名称 并实际使用它们创建一个新的 HTML ActionLink 链接到相同的操作和控制器名称 但位于不同的区域 所以我想我需要检索当前操作和控制器名称作为变量以用于构建新的 HTML Acti
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 以给定的纵横比保存绘图

    我正在使用非常棒的库 ggplot2 我想出了如何使用设置绘图的纵横比coord fixed 现在 我想将绘图保存为具有指定宽度 例如 10 厘米 的 PDF 并计算所需的高度 我不知道如何实现这一目标 这可能吗 您可以使用网格函数来计算
  • 如何在 Java 8 中从 CompletableFuture> 获取结果

    Java 8 环境 同时使用 CompletableFuture allOf 运行任务 然后从每个线程获取每个结果 然后将所有结果组合成一个组合结果并返回它 在下面的代码中 要得到结果 List
  • ANTLR4 的最小示例 Gradle 项目(带有 antlr 插件)是什么?

    我创建了新的 Gradle 项目 添加了 apply plugin antlr and dependencies antlr org antlr antlr4 4 5 3 to build gradle Created src main a
  • 轨道上的下一个对象问题

    视频影像 表 id title votes count 视频影像 控制器 def show video Video find params id next video Video order votes count DESC where v
  • 如何使用 Gson 跳过空条目

    使用 Gson 反序列化 JSON 时 有没有办法跳过 JSON 数组中的空条目 text adsfsd title asdfsd null text adsfsd title asdfsd 生成的 List 有 3 个条目 第二个条目为空
  • 过滤条件的查询字符串与资源路径

    背景 我有2个资源 courses and professors A course具有以下属性 ID topic 学期号 年 部分 教授 id A professor具有以下属性 ID 学院 超级用户 名 姓 所以 你可以说一门课程有一位教