【问题标题】:JSON vs Form POSTJSON 与表单 POST
【发布时间】:2011-12-22 13:41:51
【问题描述】:

我们正在讨论将数据发布到 REST 端点的主题。由于对象相当复杂,最简单的解决方案是简单地将它们序列化为 JSON 并将其发送到请求正文中。

现在的问题是:这是 kosher 吗?还是应该将 JSON 设置为 data=[JSON] 之类的表单参数?或者是在请求正文中发送 JSON 只是因为强制客户端使用应用程序而皱眉,通过 JavaScript 发送他们的数据,而不是让浏览器将其打包为 application/x-www-form-urlencoded

我知道所有三个选项工作。但哪些是OK?或者至少推荐

【问题讨论】:

  • 我对这次讨论的结果很感兴趣。有更新吗?我目前的理解是,JSON 内容应该作为 POST 数据的一部分传递,任何可选参数仍然可以作为 URL 参数的一部分发送。这就是 twitter REST API 的实现方式.. 仅作为参考。

标签: json rest post http-post


【解决方案1】:

我想说这两种方法都行得通 在您的 API 中保持一致非常重要。我个人会选择的选项只是将内容发送为application/json

POST 不会强迫您使用application/x-www-form-urlencoded - 它只是被大量使用的东西,因为它是网络浏览器使用的东西。

【讨论】:

  • 大多数网络浏览器使用application/x-www-form-urlencoded而不是application/json是有原因的吗?在我看来application/json 更灵活,更有表现力。
【解决方案2】:

直接将其作为序列化 JSON 发送并没有错,例如 google 默认会这样做 在它的 volley 库中(这显然是他们的推荐 REST 库对于安卓)。

事实上,关于 SO 如何使用 JSON 而是使用 volley 执行“正常”POST 请求有很多问题。这对初学者来说有点反直觉,必须覆盖它的基类'getParams() 方法。

但是默认情况下,谷歌拥有自己的 REST 库,这将是我的指标,它是 OK

【讨论】:

    【解决方案3】:

    您可以使用 JSON 作为请求数据的一部分,因为 OP 已声明所有三个选项都有效。

    OP 需要支持 JSON 输入,因为它必须支持包含复杂结构的内容。但是,这样想……您是在请求做某事,还是只是发送基本上是 document 数据的内容,而您只是碰巧使用了 POST 操作,相当于创建新条目。

    既然如此,你所拥有的基本上是一个具有 CRUDL 语义的资源端点。跟进您实际上不仅限于application/json,而是资源端点应该处理的任何类型。

    对于非资源端点

    我发现(特别是对于 JAX-RS)application/x-www-urlencoded 更好。

    1. 与 OAuth 2.0 和 OpenID Connect 保持一致,他们使用 application/x-www-urlencoded
    2. 使用 Swagger Annotations 更容易注释各个字段
    3. Swagger 提供了更多默认值。
    4. Postman 会生成一个漂亮的表格供您填写,并让测试变得更容易。

    非资源端点示例:

    • 身份验证
    • 授权
    • 简单搜索(虽然我会在这个上使用GET
    • 有许多条件的非简单搜索
    • 发送消息/文档(虽然我也会考虑multipart/form-data,因此我可以将元数据与内容一起传递,但 JAX-RS 没有针对此 Jersey 的标准,RestEasy 有自己的实现)李>

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2021-10-19
      • 2012-07-26
      • 1970-01-01
      • 2012-08-31
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多