关于休息:如何使用curl将JSON发布到PHP

How to post JSON to PHP with curl

我可能有点离谱,但我整个下午都在尝试在这个休息的PHP框架教程中运行curl-post命令。我不明白的是PHP应该如何解释我的文章,它总是作为一个空数组出现。

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

(这里的斜线只是为了让我看起来不像个白痴,但是我使用php 5.2从Windows执行了这个操作,也在Linux服务器上尝试过,与linux curl的版本相同)

一定有一些我遗漏了的东西,因为它看起来很简单,只是没有正确的解释,如果是的话,一切都会很好地工作。

这就是我得到的:

1
2
3
4
5
6
7
8
9
HTTP/1.1 409 Conflict
Date: Fri, 01 May 2009 22:03:00 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

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


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

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


Jordan对$_Post-Array未填充的原因的分析是正确的。但是,您可以使用

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

只需检索HTTP主体并自己处理它。请参见PHP输入/输出流。

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


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

试着把你的卷发要求改为:

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

看看有没有帮助。


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

命令

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

旗帜

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

资源

  • 卷曲手册页
  • 卷曲示例

您应该这样转义引号:

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