繁体   English   中英

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

[英]RESTful web services and JSON document in GET request body

我需要将复杂的JSON文档从客户端应用程序( AngularJS )发送到服务器端( JavaSpring 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 Web服务与后端进行通信。 对于数据检索,我使用GET方法,并将url与path / query参数一起使用。

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

:可以在GET请求正文中包含这种JSON吗? 如果没有,解决此问题的最佳方法是什么?

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

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

4.3.1。 得到

[...]

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

[...]

Elasticsearch是基于Lucene的搜索引擎,支持带有有效负载的GET请求 ,但我会坚持使用标准。

其他选项是:

发送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发送到服务器。

问:可以在GET请求正文中包含这种JSON吗? 如果没有,解决此问题的最佳方法是什么?

尽管GET请求在技术上可以具有body ,但我不建议依赖于此。 在我看来,这与HTTP协议的性质背道而驰。

我认为您应该向一些/xxx/query资源发布请求,以执行复杂的查询。

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

请参阅https://spring.io/understanding/REST#get了解RESTfull获取的基本规则。

检索信息。 GET请求必须是安全且幂等的,这意味着无论使用相同参数重复执行多少次,结果都是相同的。

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

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

问:可以在GET请求正文中包含这种JSON吗? 如果没有,解决此问题的最佳方法是什么?

您需要考虑两个问题:

  • GET URL长度可能超过最大长度。 可以持续多长时间取决于实现方式。 看到

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

除此之外,你应该没事。

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

通常,我将这种long值作为POST参数传递,但是从上面您可以看到一些例外。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM