【发布时间】:2013-05-03 13:41:13
【问题描述】:
我正在设计一个 API,我想知道在 GET 请求上发送 JSON 有效负载是否可以?
在这个问题Payloads of HTTP Request Methods,我们可以根据this link找到:
- HEAD - 没有定义的正文语义。
- GET - 没有定义的正文语义。
- PUT - 支持正文。
- POST - 支持正文。
- DELETE - 没有定义的正文语义。
- TRACE - 不支持正文。
- OPTIONS - 支持正文,但没有语义(可能在未来)。
这是否意味着我不应该发送带有负载的 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 ...
}
'
您觉得还可以吗?基于以上考虑。
【问题讨论】:
-
一个风险是客户端库不允许在 GET 请求中发送有效负载。老实说,我什至没有意识到你可以用 curl 做到这一点。
标签: java api http get elasticsearch