REST API 中,同一个参数多个值,正确的传递姿势是怎样的?

2018-09-13 15:40:31 +08:00
 jasonyang9

比如要获取 2 本书的信息:

GET http://server/books?id=1001&id=1002
GET http://server/books?id=1001,1002
GET http://server/books/1001/1002           这个肯定不对了

当然用 POST 配合 JSON 值过去应该是不符合语义的。

所以正确的姿势是怎样的?服务器端又应该如何获取这些值?

9757 次点击
所在节点    PHP
41 条回复
90safe
2018-09-13 16:49:06 +08:00
无论是 POST 还是 GET,都可以用:id[]=1&id[]=2 这样的类型传递。也可以:id=1001,1002 然后接收端分割成数组。
jasonyang9
2018-09-13 16:52:02 +08:00
多谢各位。我再捣鼓捣鼓
zhzer
2018-09-13 17:02:56 +08:00
随便选个分隔符不就完事?
isayme
2018-09-13 17:12:30 +08:00
有的服务端支持 id=1001&id=1002, 有的支持 id[]=1001&id[]=1002, 也有的都支持.
主要是看你们服务端的支持情况.
http://httpbin.org/get?a=1&a=2&b[]=3&b[]=4
https://httpbin.isayme.org/anything?a=1&a=2&b[]=3&b[]=4

或者直接改用 POST 方法?
fighterlyt
2018-09-13 17:24:32 +08:00
@jasonyang9 别听那伙人瞎比比,URL 长度的限制必须考虑,所以最安全的方法就是 POST
wunonglin
2018-09-13 17:48:38 +08:00
?id=1001,1002
jowan
2018-09-13 17:55:14 +08:00
rogwan
2018-09-13 18:05:07 +08:00
一般的做法是逗号分隔
SorcererXW
2018-09-13 21:19:31 +08:00
一般来说用逗号分隔问题不大, 比如 stackexchange 的 api 设计: https://api.stackexchange.com/docs/answers-by-ids
也可以考虑 http batch requests, 可以参考看看 facebook 的 api: https://developers.facebook.com/docs/graph-api/making-multiple-requests
jingniao
2018-09-13 21:33:03 +08:00
一直是逗号分隔
Raymon111111
2018-09-13 21:36:23 +08:00
就是 list 啊
Leammin
2018-09-13 23:37:05 +08:00
@GuryYu 老哥你解决了我困扰已久的问题!
Leammin
2018-09-13 23:47:44 +08:00
@GuryYu 不过 delete 要怎么办
freakxx
2018-09-14 00:03:03 +08:00
python -- django

GET http://server/books?id=1001,1002

id = "1001, 1002"
id = id.split(",")

>>> ['1001', ' 1002']
skinny
2018-09-14 07:33:00 +08:00
@Leammin 你都用了 RESTFUL,难道还用 POST 删除? DELETE 请求被你吃了?
corningsun
2018-09-14 09:10:01 +08:00
Swagger UI 自动生成的是 第一种
第二种 URL 长度明显更短

后端 Java Spring 的话,第一种和第二种都是支持的。
oongxx
2018-09-14 10:00:40 +08:00
如果你的 API 用了 OData 规范,那就用 http://host/service/Products?$filter=Name in ('Milk', 'Cheese')

https://stackoverflow.com/questions/7745231/odata-where-id-in-list-query
wizardoz
2018-09-14 10:13:53 +08:00
我想知道为啥会出现要用两个 id 来取两本书这种需求?
id 自然不是随便来的,比如 mike 收藏的两本书,那就用
http://server/books?favor_by=mike
来过滤啊。
JamesC
2018-09-14 12:24:48 +08:00
个人的做法是 /api/resources/(1,3,5,7)
其实重点在于做好 API 接收解析,id 之间分隔的规范.
直接获取是不现实的.如何编写符合 Restful 原则的规范才重要.
又或者 /api/resources?ids=1,3,5,7 也是可以的,路径要清晰,意义明显.
ps:既然选择了 Restful 的设计思路就尽量符合规范.
Leammin
2018-09-14 19:41:19 +08:00
@skinny ?我说的就是 delete 啊,我意思是批量删除要怎么操作。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX