在不使用主体有效负载的情况下,在GET请求中发送复杂选项数据的最佳方法是什么?

时间:2017-06-22 10:38:57

标签: rest http language-agnostic

所以我使用Express(通过测试开发)在Node中完成了一个服务器,在开发我的前端时,我意识到Java在GET请求中不允许任何正文有效负载。我已经完成了一些阅读并理解Http规范允许这样做,但大多数情况下标准是不在GET中放置任何有效负载。所以如果不是这样,那么将它放入GET请求的最佳方法是什么。我包含的数据大多是简单的字段,除了在我的结构中,其中一些是嵌套的,其中一些是数组,这就是为什么发送JSON似乎很容易。我该怎么做呢?

例如,我有一个包含此数据的请求

createObject

2 个答案:

答案 0 :(得分:1)

  

我已经完成了一些阅读,并了解Http规范允许这样做,但大多数情况下标准是不在GET中放置任何有效负载。

正确 - 问题在于没有定义的语义,这意味着即使您同时控制客户端和服务器,也不能指望参与讨论的中间人合作。见RFC-7231

  

我包含的数据大多是简单的字段,除了在我的结构中,其中一些是嵌套的,其中一些是数组,这就是为什么发送JSON似乎很容易。我该怎么做呢?

HTTP POST方法是将有效负载传递到资源的适当方法。 POST是HTTP词汇表中最常用的方法,它涵盖了所有用例,甚至包括其他案例所涵盖的用例。

您在POST中丢失的是请求为safeidempotent,并且您没有获得任何体面的缓存行为。

另一方面,如果JSON文档用于约束资源返回的表示,那么说JSON是该文档的标识符的一部分是正确的。 ,在这种情况下,您将其编码为query

/some/hierarchical/part?{encoded json goes here}

这使您可以返回安全语义,支持缓存等。

当然,如果你的json结构很复杂,那么你可能会发现自己在URI length上遇到了各种隐式限制。

答案 1 :(得分:1)

我发现了一些有趣的GET规范,允许发布更复杂的对象(例如数组和内部属性的对象)。许多支持GET查询的框架似乎都在解析这个问题。

对于数组,重新定义该字段。例如,对于数组ids = [1,2,3]

test.com?ids=1&ids=2&ids=3

对于嵌套对象,例如

{
    filter.id: 5,
    filter.post: 2
}

test.com?filter[id]=5&filter[post]=2