REST API最佳做法:查询字符串中的参数与请求正文中的参数


125

REST API可以在多个位置包含参数:

  1. 在请求正文中 -作为json正文或其他MIME类型的一部分
  2. 查询字符串中 -例如/api/resource?p1=v1&p2=v2
  3. 作为URL路径的一部分 -例如/api/resource/v1/v2

在上述1和2之间进行选择的最佳实践和考虑因素是什么?这里
是2 vs 3 。



除了上述内容之外,如何使用header?
变量

Answers:


39

在上述1和2之间进行选择的最佳实践和考虑因素是什么?

通常,内容主体用于要从服务器上载/从服务器上载/下载的数据,而查询参数用于指定所请求的确切数据。例如,当您上载文件时,可以在正文中指定名称,mime类型等,但是在获取文件列表时,可以使用查询参数按文件的某些属性来过滤列表。通常,查询参数是查询的属性而不是数据。

当然,这不是严格的规则-您可以按照自己认为更合适/更适合自己的方式实施它。

您可能还想查看有关查询字符串Wikipedia文章,尤其是前两段。


1
上面的分析得出的合理结论是,最好将幂等操作保留在url查询字符串中,而将CRUD最好保留在严格类型的响应正文中,这实质上是利用SOP并防止了非常基本形式的社会工程/网络钓鱼攻击
Rice

15

我假设您正在谈论POST / PUT请求。语义上,请求正文应包含您要发布或修补的数据。

查询字符串作为URL(URI)的一部分,用于标识要发布或修补的资源。

您要求最佳实践,以下是我的语义。当然,使用经验法则应该有效,特别是如果您使用的Web框架将其抽象为parameter时,尤其如此。

您最了解:

  • 某些Web服务器对URI的长度有限制。
  • 您可以使用CURL在请求正文中发送参数。
  • 您将数据发送到的位置不会影响调试。

6

以下是我的经验法则...

何时使用身体:

  • 当参数没有平键:值结构时
  • 如果值不是人类可读的,例如序列化的二进制数据
  • 当您有大量参数时

何时使用查询字符串:

  • 当您希望在调试时看到它们时
  • 如果您希望能够在开发代码时手动调用它们,例如使用 curl
  • 当参数在许多Web服务中通用时
  • 当您已经发送其他内容类型时,例如 application/octet-stream

注意,您可以混合搭配-将常见的,应该是可调试的那些放在查询字符串中,并将所有其余的放在json中。


34
根据开发便利性选择如何构造API并不是一个好习惯。
埃里克·斯坦

1
就像@EricStein所说的,您已经倒退了。
DanMan 2014年

20
伙计们,我问这个问题的原因是为了得到正确的答案。继续,写一个答案,我将删除有缺陷的答案。@EricStein
Jonathan

4
易于通过人手食用的@Jonathan API几乎总是好的API。准确呼唤KISS的荣誉
克里斯·马里西克

1
@AkshayHiremath他指的是您可能在正文中发送其他内容,例如,如果您发送了诸如“ image / jpeg”之类的ContentType标头,则您的消息正文必须包含jpeg数据,而不能在其中包含任何其他内容。它
Shayaan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.