使用参数列表作为主体或POST方法的GET方法?

时间:2016-09-23 12:07:28

标签: java spring rest http

我需要创建一个端点,它将提供一个对象列表,我需要传递作为我想要检索的对象ID的请求体列表。到目前为止,我知道这应该通过GET方法完成,因为它只检索对象而不修改它们,但是当我想使用RestTemplate从客户端调用它时,它没有{{1}的任何方法传递身体。但是,使用GET方法可以实现这一点。我应该使用POST代替POST还是使用其他解决方案?

编辑:对于遇到类似问题的每个人来说,这个帖子有很多帮助:

HTTP GET with request body

2 个答案:

答案 0 :(得分:3)

如果你想坚持语义上更正确的GET,你需要将ID列表作为Request参数而不是body传递,因为GET没有定义正文。< / p>

使用POST在这种情况下你可以传递正文中的列表,虽然有些坚持者会说它在语义上不正确,但通常也没问题。

请注意,POST有时是首选,具体取决于查询数据的复杂程度或长度。

答案 1 :(得分:1)

RFC 7231

  

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

这消除了GET作为一种选择; HTTP根本不支持您想要做的事情。

  

我需要传递我想要检索的对象ID的请求正文列表。

GraphQL作为web apis的查询语言正在获得一些牵引力。这是同样的问题;一个复杂的查询。例如,Github正在实现supports the POST method.

的graphQL端点

这确实产生了一个比REST更多的RPC。它就是这样。

这一点适用于您的问题,即通过POST作为模式进行查询确实存在为模式。

  

还有其他解决方案吗?

有一些替代设计可能会为您提供更好的服务

网页如何加载多张图片?一次一个。这种方法的一个优点是缓存 - 网页可以重复使用之前看到的图像的表示。这提供了REST架构约束所承诺的一些改进的扩展。

将此与要求表示对象列表进行比较,每次更改列表中的项目时,或每次更改单个项目的表示时,表示都必须更改。

你可以使用id本身作为URI的一部分,也就是说,如果你想要的是一个对象列表的表示,那么对象列表可能是它自己的概念(资源)和它自己的标识符

这种方法可能以两种方式之一表现出来。您可能可能会将id列表保持显式(使概念本身隐含),换句话说,通过枚举URI本身中的ID。

或者,您可以尝试在设计中明确概念 - 弄清楚客户端为什么要求特定的ID组合,并创建表示该概念的资源。例如:如果客户端正在选择ID,因为它们具有一些共同的属性(所有打开的票证),则该概念是对该属性的集合过滤 - 因此您将创建一个打开的票证资源。

同样,如果因为客户端正在翻阅结果而出现ID列表,那么您可以明确地进行分页(这种方法在提要中很常见,请参阅AtomSyndication)。

简而言之,您可能无法找到REST的好答案,因为您遇到了错误的问题。