GET HTTP请求有效负载

Seb*_*ber 13 java api get http elasticsearch

我正在设计一个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" }
            }
        }
    }
}
'
Run Code Online (Sandbox Code Playgroud)

因此,如果这个受欢迎的图书馆没有人抱怨,那么也许我可以做同样的事情吗?

顺便说一句,我想知道混合queryString参数和JSON有效负载是否可行?就像这个ElasticSearch查询一样.如果是这样,是否有规则,以便我们知道哪些参数应该是queryString参数或有效负载参数?


在这里我们可以阅读: 带有请求体的HTTP GET

罗伊菲尔丁关于将一个机构纳入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 ...
}
'
Run Code Online (Sandbox Code Playgroud)

你觉得好吗?基于以上考虑.


Jul*_*hke 3

让 GET 响应根据请求正文而变化将会破坏缓存。别去那里。