GET请求正文中的RESTful Web服务和JSON文档

时间:2016-12-23 09:48:38

标签: java json rest spring-mvc

我需要从客户端应用程序(JSON)向我的服务器端(AngularJSJava)发送一个复杂的Spring MVC/Rest文档,以便检索所需的信息

这是JSON示例:

[
   {
      "operator":"AND",
      "queries":[
         {
            "value":10,
            "comparisonOperator":"\u003e\u003d",
            "characteristicId":391
         },
         {
            "value":50,
            "comparisonOperator":"\u003c\u003d",
            "characteristicId":391
         }
      ],
      "characteristicId":391
   },
   {
      "value":true,
      "comparisonOperator":"\u003d",
      "characteristicId":383
   }
]

我的客户端应用通过RESTful网络服务与后端进行通信。对于数据检索,我使用GET方法并将url与路径/查询参数一起使用。

我怀疑如何处理我必须获取数据并提供上述JSON文档的情况。

:将这种JSON包含在GET请求正文中是否可以? 如果不是,解决这个问题的最佳方法是什么?

无论如何,由于此文档的架构较少,我无法使用路径/查询参数更改此JSON

5 个答案:

答案 0 :(得分:3)

我不会在GET有效负载中发送JSON。对于GET请求,有效负载没有定义语义,某些服务器可能拒绝该请求。为了支持它,这里引用了RFC 7231,它是HTTP / 1.1协议语义和内容的当前参考:

  

4.3.1. GET

     

[...]

     

GET请求消息中的有效负载没有定义的语义;      在GET请求上发送有效负载正文可能会导致某些现有负载      拒绝请求的实现。

     

[...]

基于Lucene的搜索引擎Elasticsearch支持GET requests with a payload,但我会坚持标准。

其他选项包括:

将JSON作为查询参数发送

如果采用这种方法,参数值必须是URL编码的。对于您在问题中发布的JSON,它将是http://example.org/api?query=%5B%7B%22operator%22%3A%22AND%22%2C%22queries%22%3A%5B%7B%22value%22%3A10%2C%22comparisonOperator%22%3A%22%3E%3D%22%2C%22characteristicId%22%3A391%7D%2C%7B%22value%22%3A50%2C%22comparisonOperator%22%3A%22%3C%3D%22%2C%22characteristicId%22%3A391%7D%5D%2C%22characteristicId%22%3A391%7D%2C%7B%22value%22%3Atrue%2C%22comparisonOperator%22%3A%22%3D%22%2C%22characteristicId%22%3A383%7D%5D

使用POST执行搜索

您可以假设搜索是一种资源,并使用POST将请求有效负载中的JSON发送到服务器。

答案 1 :(得分:1)

  

问:将这种JSON包含在GET请求体中是否可以?如果   不,解决这个问题的最佳方法是什么?

在GET请求MAY technically have body时,我不建议依赖此。这看起来违背了HTTP协议的本质。

我认为您应该向某些/xxx/query资源发送POST请求以执行复杂查询。

答案 2 :(得分:1)

在GET请求中有身体是好的。所有HTTP客户端都应该没有问题发出这样的请求。请注意,您执行的操作应该是幂等的,没有副作用。换句话说,它应该是查询,而不是修改服务器状态的操作。

有关RESTfull get的基本规则,请参阅https://spring.io/understanding/REST#get

  

检索信息。 GET请求必须是安全且幂等的,   意思是不管用它重复多少次   参数,结果是一样的。

我不会在查询参数中发送编码的JSON。它将完全不可读(因为编码),因此无用。它也可能不安全并且显示太多信息,因为通常请求正文在Web服务器日志中可用。

最后,对于某些请求,您可能会达到URL大小的限制(详细信息取决于客户端库和服务器实现,但URL大小的限制往往比身体大小的限制短得多。

答案 3 :(得分:0)

  

问:将这种JSON包含在GET请求体中是否可以?如果   不,解决这个问题的最佳方法是什么?

您需要考虑两个问题:

  • GET URL长度可能超过最大长度。它可以多久 取决于实施。 See

  • 您需要对查询字符串中的JSON进行URL编码

除此之外你应该没事。

答案 4 :(得分:0)

您可以将json添加为HTML编码的参数值。这可能会使URL很长,可能超过最大URL长度限制,因此这应被视为不可靠的方法。如果您的URL不会被最终用户直接使用,那么可读性不是真正的问题,但如果他们直接使用它,那么使URL尽可能短应该是一个目标。另一方面,如果页面的关键功能在没有JSON的情况下不起作用,那么将它用作GET参数值可能是一种激励,可能使用base64或其他方法对其进行加密。

一般情况下,我将这种长值作为POST参数传递,但是从上面可以看到一些例外情况。

从技术上讲,这应该可行,但可能会遇到长JSON问题。