我需要从客户端应用程序(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
网络服务与后端进行通信。对于数据检索,我使用GET
方法并将url与路径/查询参数一起使用。
我怀疑如何处理我必须获取数据并提供上述JSON
文档的情况。
问:将这种JSON
包含在GET请求正文中是否可以?
如果不是,解决这个问题的最佳方法是什么?
无论如何,由于此文档的架构较少,我无法使用路径/查询参数更改此JSON
。
答案 0 :(得分:3)
我不会在GET
有效负载中发送JSON。对于GET
请求,有效负载没有定义语义,某些服务器可能拒绝该请求。为了支持它,这里引用了RFC 7231,它是HTTP / 1.1协议语义和内容的当前参考:
[...]
GET
请求消息中的有效负载没有定义的语义; 在GET
请求上发送有效负载正文可能会导致某些现有负载 拒绝请求的实现。[...]
基于Lucene的搜索引擎Elasticsearch支持GET
requests with a payload,但我会坚持标准。
其他选项包括:
如果采用这种方法,参数值必须是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问题。