获取 HTTP 请求有效负载

2022-09-03 02:51:21

我正在设计一个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 ...
}
'

这对你来说似乎很好吗?基于以上考虑。



答案 1

如果 GET 响应因请求正文而异,则会中断缓存。不要去那里。


答案 2

另请参阅:带有请求正文的 HTTP GET - 有关此内容的更多详细信息。

要点是:是的,你可以,但你可能不应该出于各种原因,包括:

  • 您可能忽略了 HTTP 规范建议(您可能希望 POST)
  • 您可能会引入缓存问题
  • 就REST API而言,这并不直观

推荐