rest - 构建 REST API:如何决定哪些参数用于标头、正文、URL 或查询?
问题描述
你如何决定参数的去向?假设 API 用于一个对象,该对象有一个 ID、几个字段,并且每个请求可能有也可能没有令牌。对象必须有 GET、PUT、POST 和 DELETE 请求。
解决方案
通常,您希望将标识资源所需的所有参数直接编码到某处的 URI中。这允许您为 URI 添加书签以供以后重复使用,并与其他人/进程共享该书签。
例子:
此资源所需的所有上下文都GET
在这里。您可以单击它、保存它、通过电子邮件发送它,它本身仍然很有用。
那么信息在 URI 中的什么位置?
如果仅在下载表示后客户端才需要该信息,那么您可以考虑将其编码到片段中。
URI 的片段标识符组件允许通过参考主要资源和附加标识信息来间接标识次要资源。
在 Web 上,片段很有用,因为它们允许您调用用户代理来关注表示中的特定元素。该片段不通过网络发送,而仅在客户端使用。想想数据传输对象——一个大的可缓存文档(所以我们不需要很多往返),其中有很多指向其中特定信息的 URI。
其他参数可以编码为路径段或查询字符串。机器不在乎(20 年前,这有点不太正确——我们有时不得不解决不能正确处理 URI 的查询部分的缓存)。
通过查询字符串配置参数的 URIapplication/x-www-form-urlencoded
在 Web 上很方便,因为 HTML 支持在客户端上创建这些标识符。
如今,我们可以使用URI 模板来描述如何计算新的 URI,这为您提供了更多选择。
相对分辨率为我们提供了一种通用机制,用于根据给定的引用标识符计算新的 URI。考虑带有符号链接的点引用。该机制主要基于导航 URI 的分层部分,即path。
机器不关心资源的层次结构,标识符的层次结构是并行的
# Here's an identifier for a collection
/collection
# Here's an identifier for a member of this collection
/collection/member
# Here's an identifier for a collection
/2c957fb6-ac92-4fdb-a086-02292c3b7c7c
# Here's an identifier for a member of this collection
/41d36a69-d10c-4503-8e5e-3b2d64e9c3a6
就机器而言,所有这些样品都很好;但人类往往更容易与顶级组合一起工作。
标头是属于“通过网络传输文档”领域的元数据。
正文是文档本身——它是通过网络传输的消息(http 请求和标头在某种意义上是承载消息的信封)。是的,这有时意味着消息中的信息也会被复制到标头中,或者通过模板复制到 target-uri 中。
推荐阅读
- c++ - "的多重定义
" 使用 cpp 编译 cuda 代码时出错 - c - DMA 代理以及它如何用于将以太网帧复制到用户缓冲区
- java - 在使用类加载器或资源工具时,在 Jboss 中读取文件会导致异常
- react-native - 反应原生元素无法识别样式化组件自定义字体
- python - 如何以二进制格式存储来自 NEST 模拟器的记录数据?
- reactjs - 在 React Native 中同时运行任务
- nginx - Nginx 身份验证在根页面(HTTPS)上不起作用
- gstreamer - 在 ubuntu1804 上编译 Gstreamer/orc 0.4.32 以使用 ninja 在 rootfs 中运行 arm 发生未定义的引用异常
- c - 使用链表中的堆栈反转C中的字符串
- rust - 我们如何处理 gtk-rs 中输入框的按钮单击事件?