如何使用curl将JSON发布到PHP


108

我可能还差得远,但是我整个下午一直在尝试在这个嵌入式PHP框架教程中运行curl post命令。我不明白的是PHP应该如何解释我的POST,它总是作为一个空数组出现。

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(其中的斜线只是让我看起来不像个白痴,而是我使用PHP 5.2在Windows上执行此操作,也曾在Linux服务器(与Linux curl相同版本)上尝试过)

我必须缺少一些东西,因为它看起来很简单,帖子解释得不好,如果可以的话,一切都会很好。

这就是我得到的:

HTTP / 1.1 409冲突
日期:2009年5月1日,星期五,格林尼治标准时间
服务器:Apache / 2.2.8(Win32)PHP / 5.2.6
X-Powered-By:PHP / 5.2.6
传输编码:分块
内容类型:text / html; 字符集= iso-8859-1

{“ screencast”:{“ id”:null,“ subject”:null,“ body”:null,
         “ dataUrl”:null,“ dataMedium”:null,“ createdOn”:null,“ author”:null}}

您还可以复制粘贴.php文件吗?您确定URL localhost:3570 / index.php / trainingServer / screencast.json运行您的脚本吗?它看起来不像PHP URL。
pt

@pts; Peter正在使用某种MVC框架,请查看该URL中的index.php。
艾伦·斯托姆

@pts我正在使用Delphi for PHP(因此为:3570)和Recess MVC框架(没有.htaccess文件),因此也使用了URL中的index.php /。
彼得·特纳

7
不要忘记将其作为发送application/json
Gumbo

1
将双引号嵌入简单引号时,不必转义双引号。

Answers:


107

Jordans关于为什么不填充$ _POST数组的分析是正确的。但是,您可以使用

$data = file_get_contents("php://input");

只是检索http正文并自己处理。参见PHP输入/输出流

从协议的角度来看,这实际上是更正确的,因为您实际上并不是在处理http多部分表单数据。另外,在发布请求时,将application / json用作内容类型。


7
进行json_decode(file_get_contents(“ php:// input”),true)可行。谢谢
彼得·特纳

真的帮了我的忙!谢谢Emil H!
史蒂夫

太棒了 Zend认为这会剥夺职位,给我带来很多麻烦。.一个简单的提取方法对我有用。Peter Turners还添加了json_decode()来提供\ stdClass对象。我将其用于Garmin API ping响应
JI-Web

120

通常,该参数-d被解释为形式编码。您需要-H参数:

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json

18

我相信您会得到一个空数组,因为PHP期望发布的数据采用Querystring格式(key = value&key1 = value1)。

尝试将您的curl请求更改为:

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

看看是否有帮助。


是的,-H "Content-Type: application/json"对我没有用。
PJ Brunet

13

您需要设置一些额外的标志,以便curl将数据作为JSON发送。

命令

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

标志

  • -H:自定义标头,下一个参数应为标头
  • -X:自定义HTTP动词,下一个参数应为动词
  • -d:将下一个参数作为数据发送到HTTP POST请求中

资源


1

您应该这样删除引号:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

在Windows上,这实际上对我有用,但是使用双引号将整个json字符串括起来。
meatvest 2012年

在Windows上,您必须按照上文Josef的建议转义双引号。他是对的。
Bobo'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.