【问题标题】:GET method with list of paramethers as body or POST method?带有参数列表作为主体或 POST 方法的 GET 方法?
【发布时间】:2016-09-23 12:07:28
【问题描述】:

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

编辑:对于有类似问题的每个人,这个帖子都有很大帮助:

HTTP GET with request body

【问题讨论】:

    标签: java spring rest http


    【解决方案1】:

    如果您想坚持GET,这在语义上更正确,您需要将 ID 列表作为请求参数而不是正文传递,因为 GET 没有定义正文。

    使用POST 在这种情况下,您可以在正文中传递列表,通常也可以,尽管有些坚持者会说它在语义上不正确。

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

    【讨论】:

    • 请注意,POST 有时是首选,具体取决于查询数据的复杂程度、长度甚至是敏感
    【解决方案2】:

    RFC 7231

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

    这消除了 GET 作为选项; HTTP 根本不支持你想做的事情。

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

    GraphQL 作为一种用于 Web api 的查询语言正在获得一些关注。这是同一类问题;一个复杂的查询。例如,Github 正在实现一个 graphQL 端点,supports the POST method.

    这确实产生了一个比 REST 更 RPC 的 api。就这样吧。

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

    还有其他解决办法吗?

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

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

    将此与请求对象列表的表示进行比较,其中每次更改列表中的项目或每次任何单个项目更改其表示时,表示必然会发生变化。

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

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

    或者,您可以尝试在设计中明确说明该概念 - 找出客户要求特定 id 组合的原因,并创建一个代表该概念的资源。例如:如果客户端选择 id 是因为它们有一些共同的属性(所有打开的票证),那么这个概念就是对该属性的集合过滤——因此您将创建一个打开的票证资源。

    同样,如果由于客户端对结果进行分页而产生 id 列表,那么您可以使分页显式(这种方法在提要中很常见,请参阅AtomSyndication)。

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

    【讨论】:

    • 在我的情况下,由于 ID 的复杂性,使用 id 作为 URI 的一部分不是一个选项,这在某些情况下会导致长度超过 4.000 个字符的 URI,我认为这不是完美的解决方案。 (处理这么长的 URI 可能会给 Web 浏览器带来一些麻烦)第二种方法似乎很有趣,几乎就是这种情况,唯一的区别是我想从一些票池中获取未公开票(所有票从 1-1000 ) 我只想要来自 1,5,71,189 池等的公开门票。哪种方法最适合这种情况?
    • 客户端选择的是1,5,71,189而不是1,6,71,189是什么意思?那里隐藏着什么隐含的想法?明确表达这个想法是否有助于解决问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多