JSON vs Form POST

时间:2011-12-22 13:41:52

标签: json rest post http-post

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

现在的问题是:这是犹太人吗?或者是否应将JSON设置为表格参数,如data = [JSON]?或者是在请求体中发送JSON,因为强迫客户使用该应用程序,通过JavaScript发送数据而不是让浏览器将其打包为application/x-www-form-urlencoded

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

3 个答案:

答案 0 :(得分:24)

我会说这两种方法都能很好地运作  在API中保持一致非常重要。我个人选择的选项只是将内容发送为application/json

POST并没有强迫您使用application/x-www-form-urlencoded - 这只是一些经常被使用的东西,因为它是webbrowsers使用的东西。

答案 1 :(得分:5)

直接将其作为序列化JSON发送没有任何问题,例如谷歌默认在其volley库(显然是他们的推荐)用于android的REST库。

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

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

答案 2 :(得分:2)

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

OP需要支持JSON输入,因为它必须支持包含复杂的结构内容。但是,按照这种方式考虑......你是在提出做某事的请求,还是只是发送基本上是文档的数据而你恰好使用POST操作作为相当于创建新条目。

在这种情况下,您所拥有的基本上是具有CRUDL语义的资源端点。接下来,您实际上不仅限于application/json,而是资源端点应该处理的任何类型。

对于非资源端点

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

  1. 与OAuth 2.0和OpenID Connect保持一致,他们使用application/x-www-urlencoded
  2. 使用Swagger Annotations
  3. 更容易为各个字段添加注释
  4. Swagger提供更多默认值。
  5. 邮差生成一个很好的表格供您填写并使事情更容易测试。
  6. 非资源端点的示例:

    • 验证
    • 授权
    • 简单搜索(虽然我会在这个上使用GET
    • 有许多标准的非简单搜索
    • 发送消息/文档(虽然我也会考虑multipart/form-data所以我可以传递元数据和内容,但是JAX-RS没有这个版本的标准,而Jersey和RestEasy都有自己的实现)