2013-05-03 58 views
12

我正在设计一个API,我想知道是否可以在GET请求上发送JSON有效载荷?GET HTTP请求有效载荷

在此的其他问题Payloads of HTTP Request Methods,我们可以根据this link发现:

  • 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" } 
      } 
     } 
    } 
} 
' 

所以,如果这个流行libary做它,没有人抱怨,那么也许我可以这样做?

顺便说一下,我想知道如果这是好的混合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 ... 
} 
' 

它看起来罚款吗?基于上述考虑。


+1

的风险之一将是客户端库不允许有效载荷在GE发T请求。老实说,我甚至都没有意识到你可以用卷曲来做到这一点。 – bdkosher 2013-05-03 13:48:52

回答

1

让GET响应根据请求的不同而不同,会破坏缓存。不要去那里。

+0

这是一个API,我不需要缓存,因为它是通过标识客户端的OAuth2头文本化的。不同的客户端可以具有相同资源URI的不同表示,所以我不能根据资源URI进行缓存 – 2013-05-03 14:49:31

+0

所有中介/库都知道这一点吗? – 2013-05-03 14:51:55

+0

肯定是因为他们需要访问允许他们操作用户帐户的OAuth2令牌。因此,/ profile资源是客户端拥有OAuth2标记的用户配置文件(作为标题给出) – 2013-05-03 15:53:45

1

Google App Engine是一个流行的网页框架,使用了一个特殊的url获取库,其中does not support making HTTP GET requests with a payload。因此,如果您希望您的API访问Google App Engine用户,那么我不会建议要求此行为。我使用Google打开了an issue regarding this

+0

请注意,如果您需要发出'GET'请求,则可以在'source'查询字符串参数中对请求主体进行urlencode编码,而不是将其与请求正文一起发送。 – 2015-04-16 03:49:56

0

仅仅因为你可以做一些事情,并不意味着你应该。对不起,如果这听起来很令人反感,但有关标准的事情是,它们是标准 - 而HTTP是最成熟的标准之一。这并不完美,很多人都想改变它,但事实上几乎每个人都仍然使用URL参数来处理这样的用例,这对我来说足以说明,没有现在任何可靠的替代品。

来自speedplane和Julian Reschke的答案给出了两个具体的例子,如果你依赖于GET/GET/GET/GET/GET/GET/GET/GET/GET/POST请求,如果你愿意,你可以以不同的方式为你的应用程序编写你的应用程序,但是网络是一个标准应该比平常更加严肃的地方。我知道成为开拓者很有诱惑力,但要充分尊重,请考虑有多少网站存在,以及有多少网络程序员正在构建和维护它们。如果有一个明确更好的方法,那么到目前为止,你很可能会看到它被广泛用于生产。

标准改变/被慢慢采用,因为很多人不得不同意他们的工作。你说的有是破坏规则的应用程序是正确的,但你会注意到它们已经给人们带来了麻烦,并且在某些情况下需要解决方法/冗余措施,正如Aetherus在他们对另一个人的评论中提到的那样回答。我倾向于在这样的问题上采取阻力最小的路径。如果你真的想这样做,我相信你可以让它工作。

1

另请参阅:HTTP GET with request body - 有关详细信息。

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

  • 你可能忽略了HTTP规范建议(你可能想POST)
  • 您可能引进缓存问题
  • 这是直观尽可能的REST API去
相关问题