design-patterns - 在 REST API 中定义操作
问题描述
我正在处理一个消息请求,该请求将包含用于在目标中创建记录的完整请求详细信息。
这种集成在不同时间创建了 3 种不同类型的记录(订单、装运、发票),即并不总是可以一次创建所有记录,因此我需要让系统知道只创建某些请求。
我的问题,在请求中添加此信息的最佳方式是什么?
它是否需要在请求的正文中?
{ "OrderNumber": "1234", "operation": [ "orderentry", "shipment", "invoice" ] }
它需要在路径中吗?
/Order/create?operation=orderentry
它需要在单独的对象中吗?说
{ "operation": [ "orderentry", "shipment", "invoice" ], "request": { "OrderNumber": "1234", } }
解决方案
请求的有效 uri 应该标识正在修改的文档;有效载荷应该是描述修改的文档。
POST /home.html
Content-Type: text/plain
Bob, please fix the spelling error in the title. Thanks.
/home.html 标识我们正在修改的文档;正文告诉我们客户想要进行的修改。
统一的接口约束确保每个人(服务器、客户端、中间组件)都以相同的方式解释此消息——请求的语义在任何地方都是相同的,响应的语义也是如此。
请注意,我们不会将请求发送到/home.html?edit
or/home.html?operation=edit
因为它们是两个不同的资源(我们知道这一点,因为标识符不同)。通过正确识别我们在请求中修改的资源,我们可以让通用组件清楚地知道发生了什么,这样它们就可以做一些智能的事情(比如使缓存失效)。
信息是否需要在“单独的对象”中是模式设计的问题;HTTP 真的不关心您在通过网络传输的文档中使用什么模式。
推荐阅读
- python - 使用 GEKKO 的服务器无法访问。到底是怎么回事?
- angular - 使用行分组时primeng p-table虚拟滚动显示前行
- c# - 中继器中标签上的 NullReferenceException
- javascript - 让 google-map-react 库加载
- mule-esb - 如何根据环境在 Mule ESB 3.9.0 中加载属性文件?
- c# - 连接到长时间运行的套接字 API
- java - 如何删除输出中的空最后一行?
- android - Okhttp interceptor for NewRelic?
- c# - 无法使用 c# 以编程方式访问 iis 远程服务器
- elasticsearch - Elasticsearch 匹配数组使用