17

我一直在阅读一些 REST 教程,其中一些说为了将数据发送到 REST API,您应该将发布数据作为数组发送,如下所示:

$data = array('foo' => 'bar');
$rest->post($data);

然后还有其他人说您应该像这样发送 JSON 数据:

$data = array('foo' => 'bar');
$data = json_encode($data);
$rest->post($data);

不确定是否有这样做的标准方法,或者是否可以,但是在设计 API 时通常推荐什么?

编辑:似乎有混乱。为了澄清,我同意 JSON 应该用于客户端消费,但这个问题是关于 SERVER 消费的。这意味着服务器应该接受来自其客户端的 JSON 或 POST 数据吗?

4

7 回答 7

7

如果您是创建 RESTful API 的人,这意味着您的应用程序是服务器并且正在接受请求,那么您的问题似乎令人困惑。您的应用程序不会发送任何POST数据;客户将向POST您发送数据。

话虽如此,拥有一个接受 JSON 编码请求的 API 是可能的,但实际上只对非常小众的场景有用。绝大多数客户端将以 POSTapplication/x-www-form-urlencoded格式将数据发布到您的 API。PHP 在幕后为您处理这个问题,并将数据公开为$_POST超全局。

如果您正在谈论响应POST 请求,以及您应该使用什么格式,那么这将取决于客户端希望您发送的格式。客户端将在Accept标头中指定这一点,或者某些 API 允许它在 URL 中指定(例如foo.com/some/thing/123.jsonfoo.com/some/thing/123/json)。客户端不需要告诉你的应用程序它想要什么格式,所以你可以选择一个合理的默认值。如今,大多数 API 都将使用 JSON。

不过,我从未听说过能够理解序列化 PHP 数组格式的 API,所以我不知道您一直在阅读哪些资源,但我很确定您误解了他们的建议。

于 2012-08-11T21:13:32.770 回答
2

实际上,我认为这是一个很好的问题。不知道为什么它被否决了。

此外,与我在一些评论中看到的相反,客户可以使用他想要的任何语言,而不仅仅是 javascript。并且知道使用哪种语言来“构建”请求并不是服务器的工作,只是该请求是有效的。如果您认为发出请求的实体实际上可以是另一台服务器(想想用于跨域发送 post 请求的代理服务器),这更有意义。


话虽如此,我个人认为服务器端使用 XML 或 JSON 会更好。主要原因是验证。

根据模式验证 XML 或 JSON 更容易。模式也可以公开,一个设计良好的模式可以自己描述网络服务。客户端甚至可以在将请求发送到服务器之前使用相同的模式来验证请求。

当然,传递 url 编码形式也是有效的。并且也可以在服务器端进行验证。所以我认为,在路上,这只是一个偏好问题。

另外,请查看 SO 中的此讨论,它涉及相同的主题:

JSON 与表单 POST

于 2013-05-14T18:36:01.570 回答
1

您应该考虑将使用 API 的客户端。HTML5\AJAX 客户端可能需要 JSON 数据,而其他客户端(Silverlight 或本机移动应用程序)可能更擅长使用 XML。

用于编写 REST API 的一个伟大的框架/平台是微软的 Web API(基于 ASP.NET MVC)。该产品继承了 WCF 框架并允许用户在 MVC 环境中编写 REST API。一个特点是它根据 HTTP Accept 标头选择序列化提供程序。

因此,如果客户端接受 application/json,他们将使用 JSON 格式的服务,如果接受 XML,他们将使用 XML 格式的服务。您还可以编写自己的对象序列化程序并将其插入框架。

更多信息:http ://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/video-your-first-web-api

于 2012-08-11T20:57:45.847 回答
1

大多数情况下,您希望坚持接收 POST 数据,但我认为接收 json 数据确实有其用途,例如在批处理请求时。

Facebook API 使用它。

你不需要做file_get_contents('php//input')。从 facebook 文档中,您可以执行以下操作:

curl -X POST "http://example.com/batch" -d 'batch={ "param" : 1, "param2" : "2"}'

然后在 PHP 代码中,如果您使用的是 PHP,您可以通过 $_POST 参数获取它并执行 json_decode。

var_dump($_POST);

array(1) {
  ["batch"]=>
  string(30) "{ "param" : 1, "param2" : "2"}"
}

var_dump(json_decode($_POST['batch'], true));

array(2) {
  ["param"]=>
  int(1)
  ["param2"]=>
  string(1) "2"
}
于 2012-10-04T02:36:54.390 回答
0

JSON 更有意义,因为它与语言无关,并且在 API 扩展时很有用。

于 2012-08-11T20:47:07.910 回答
0

我目前正在开发一个REST API,我也在问自己同样的问题。经过一些研究,我发现这不是标准,完全取决于你。

您正在开发服务器端,因此您可以决定如何将数据发送给您。客户需要适应您的设计。

我个人选择直接在正文POST中接收所有PUT数据。JSON

于 2014-04-17T14:32:32.747 回答
0

重点是重用已经存在的 HTTP 实现。

HTTP 被构建为接受许多不同的内容类型,您只需要在headers中指定您使用的内容类型。

接受各种格式并处理内容类型标头的 REST API 令人耳目一新。您可以从 HTML 网页提交 x-www-form-urlencoded 值或使用原始 JSON 发出 AJAX 请求,只要每个人都遵循协议,就不会产生混淆。

作为开发人员,您必须选择您的应用程序将提供的支持,因为您无法支持所有内容。通常它归结为您自己的环境的支持或便利——没有人想重新发明轮子。

许多在设计时考虑到构建 API 的框架在较低级别处理最流行的内容类型。他们还可以根据“Accept”标头对响应数据进行编码。

实现你认为最先使用的任何东西,或者找到一个已经使用 HTTP 并为你处理所有这些的框架。

于 2016-12-08T23:24:02.553 回答