[英]RESTful web services and JSON document in GET request body
我需要将复杂的JSON
文档从客户端应用程序( AngularJS
)发送到服务器端( Java
, 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
Web服务与后端进行通信。 对于数据检索,我使用GET
方法,并将url与path / query参数一起使用。
我不确定如何处理必须获取数据并提供上述JSON
文档的情况。
问 :可以在GET请求正文中包含这种JSON
吗? 如果没有,解决此问题的最佳方法是什么?
无论如何,由于本文档的架构较少,我无法使用路径/查询参数更改此JSON
。
我不会在GET
有效负载中发送JSON。 对于GET
请求,有效负载没有定义的语义,某些服务器可能会拒绝该请求。 为了支持它,这是RFC 7231的引言,它是HTTP / 1.1协议的语义和内容的当前参考:
[...]
GET
请求消息中的有效负载没有定义的语义。 在GET
请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。[...]
Elasticsearch是基于Lucene的搜索引擎,支持带有有效负载的GET
请求 ,但我会坚持使用标准。
其他选项是:
如果采用这种方法,则参数值必须经过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.