获取 HTTP 请求有效负载
我正在设计一个API,我想知道在GET请求上发送JSON有效负载是否可以?
在另一个问题中,HTTP请求方法的有效负载,我们可以根据此链接找到:
- HEAD - 没有定义的主体语义。
- GET - 没有定义的主体语义。
- PUT - 身体支持。
- 开机自检 - 支持正文。
- 删除 - 没有定义的正文语义。
- 跟踪 - 不支持正文。
- 选项 - 正文支持,但没有语义(也许将来)。
这是否意味着我不应该发送带有有效负载的GET请求?这样做有风险吗?
- 就像让一些HTTP客户端库无法发送这样的有效负载一样?
- 或者我的 Java API 代码在某些应用程序服务器上无法移植?
- 别的东西?
我发现 ElasticSearch 在 GET 请求中使用了这样的有效负载:
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
因此,如果这个流行的图书馆做到了,没有人抱怨,那么也许我也可以这样做?
顺便说一句,我想知道是否可以混合查询字符串参数和JSON有效负载?就像这个 ElasticSearch 查询一样。如果是这样,是否有规则,以便我们知道哪些参数应该是 queryString 参数或有效负载参数?
在这里我们可以读到:带有请求正文的HTTP GET
Roy Fielding 关于在 GET 请求中包含正文的评论。
是的。换句话说,任何HTTP请求消息都被允许包含消息正文,因此必须牢记这一点来解析消息。但是,GET 的服务器语义受到限制,使得主体(如果有)对请求没有语义意义。解析的要求与方法语义的要求是分开的。
所以,是的,你可以用GET发送一个身体,不,这样做是没有用的。
这是 HTTP/1.1 分层设计的一部分,一旦规范被分区(工作正在进行中),它将再次变得清晰。
....罗伊
然后我真的不明白为什么它永远没有用,因为在我看来,将复杂的查询发送到服务器是有道理的,这些查询不适合queryParam或matrixParam。我认为ElasticSearch API的设计人员也是这么想的...
我正计划设计一个可以这样调用的API:
curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
"someSearchFilter1":"filterValue1",
"someSearchFilter2":"filterValue2",
"someSearchFilterList": ["filterValue3","xxx"]
... a lot more ...
}
'
这对你来说似乎很好吗?基于以上考虑。