我正在设计一个 API,我想知道在 GET 请求上发送 JSON 有效负载是否可以?
在HTTP 请求方法的这个其他问题中,我们可以根据这个链接找到:
- HEAD - 没有定义的正文语义。
- GET - 没有定义的正文语义。
- PUT - 支持身体。
- POST - 支持正文。
- DELETE - 没有定义的正文语义。
- TRACE - 不支持正文。
- 选项 - 支持正文但没有语义(可能在将来)。
这是否意味着我不应该发送带有有效负载的 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" }
}
}
}
}
'
因此,如果这个受欢迎的图书馆做到了并且没有人抱怨,那么也许我也可以这样做?
顺便说一句,我想知道混合 queryString 参数和 JSON 有效负载是否可以?就像这个 ElasticSearch 查询一样。如果是这样,是否有规则让我们知道哪些参数应该是 queryString 参数或有效负载参数?
在这里我们可以阅读: HTTP GET with request body
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 ...
}
'
你觉得还好吗?基于以上考虑。