我想设计一个API调用,按照静止原则。
LLET假设我想获取用户信息,其中用户识别使用IDS。
通过一个获取方法,呼叫会看起来: /用户?id = xxxxx,yyyyy,....问题是:当发送的用户列表太大时会发生什么?达到URI尺寸限制。
通过帖子方法,呼叫看起来像: /users
请求主体看起来像:
{
"users": [XXXXX, YYYYY]
}
我应该如何正确设计?
据我所知,GET方法仅应用于读取数据,并发布方法来创建新资源。
这是不对的。
RFC9110。 总结:
GET是一个有效的仅阅读请求,以接收资源当前表示的副本 post不受限制(“根据资源自己的特定语义封闭在请求中的表示表示”)。 仅在某些其他方法适合某些方法的情况下使用时才成为一个问题 -
Fielding,2009年GET
的最小支持长度为8000八十千位)。那时,我们需要放弃使用
的好处,并恢复为使用编码为主体的识别信息。GET
但问题是关于设计的。您将如何创建一个应该能够的API:阅读所有用户,阅读用户列表以及创建新用户。所有尊重休息原则想想您将如何使用网页进行操作。
如果我们有大量用户,并且希望客户希望能够遍历列表,那么我们可能会引入大量页面资源,并具有第一个/上一个/上/下一个/最后的链接关系以允许您要浏览这些页面。
如果我们想支持有关条目任意收集的查询,我们可能会有一个表格可以从用户那里收集信息,然后将这些信息与URI模板结合在一起,以将该信息运送到服务器。
3b)如果请求确实确实具有大数据集,则您可能需要在响应中引入分页 - 实际上是在服务器上“创建”新的资源,这是该特定查询的结果集,这些问题本身会链接一起以轻松分页。3A)由于HTTP的缓存无效规则,我们可能希望使用可缓存页面的标识符,因为搜索仅有效地读取,并且不应使以前的缓存响应无效。 因此,这可能是针对此特定相互作用的URI
3C)如果表示形式很大(因为您不需要分页;或者因为页面确实很大),则范围请求可能很有用。
您需要与RFC 3986和RFC 9110一致的资源标识符;如果您将自己限制在URI模板描述的拼写(请参阅RFC 6570)。
在路径与查询中编码信息中对信息进行编码是一个权衡问题:使用路径段对于相对分辨率很方便;使用查询部分很方便HTML表单。 Beyond,您有很多自由,就像您在编程语言中选择变量名称一样 - 机器不在乎,因此请使用额外的自由度,使您关心的人类更容易事大约POST
Is
fine