JSON vs Form POST

Joh*_*ink 37 rest post json http-post

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

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

我知道这三个选项都有效.但是,这是OK?或至少推荐

Tom*_*rdt 26

我会说这两种方法都能正常运行,因此保持API的一致性非常重要.我个人选择的选项只是将内容发送为application/json.

POST并没有强迫你使用application/x-www-form-urlencoded它 - 它只是被大量使用的东西,因为它是webbrowsers使用的东西.

  • 大多数网络浏览器使用“application/x-www-form-urlencoded”而不是“application/json”是否有原因?在我看来,“application/json”更灵活、更具表现力。 (3认同)

Lev*_*ite 6

将它直接作为序列化JSON发送没有任何问题,例如google默认在它的volley库中执行此操作(显然这是他们推荐的用于android的REST库).

事实上,关于如何使用JSON,有很多问题,而是用排球执行"正常"的POST请求.这对于初学者来说有点反直觉,不得不覆盖它的基类getParams()方法.

但谷歌有自己的REST库默认执行此操作,这将是我的指示,它是好的.


Arc*_*ano 5

您可以使用 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. Swagger 提供了更多的默认值。
  4. Postman 生成了一个很好的表格供您填写,并使测试更容易。

非资源端点示例:

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