Rest API应该接受POST数组还是JSON字符串?

时间:2012-08-11 20:45:39

标签: php json api 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消费。 SERVER是否应该接受来自客户端的JSON或POST数据?

7 个答案:

答案 0 :(得分:6)

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

话虽如此,拥有一个接受JSON编码请求的API是可能的,但实际上只对非常小的场景有用。绝大多数客户将以application/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,所以我不知道你一直在阅读什么资源,但我很确定你误解了他们的建议。

答案 1 :(得分:2)

实际上,我认为这是一个非常好的问题。不知道为什么它被投票了。

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


就是说,就个人而言,我认为服务器端使用XML或JSON更好。主要原因是验证。

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

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

另外,请在SO中查看此讨论,它会考虑相同的主题:

JSON vs Form POST

答案 2 :(得分: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

答案 3 :(得分:1)

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

Facebook API uses it

您无需执行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"
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

就我个人而言,我选择直接在正文中接收所有POSTPUT数据作为JSON

答案 6 :(得分:0)

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

HTTP可以接受许多不同的content-types,您只需要在headers中指定您使用的内容。

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

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

许多使用构建API设计的框架,处理较低级别的最流行的内容类型。他们还可以根据"Accept" header编码响应数据。

实施您认为最先使用的内容,或找到已经说出HTTP的框架并为您处理所有这些。