如何在PHP中发送没有请求数据的cURL POST?

时间:2014-09-10 13:08:58

标签: php http post curl

我的目标是向服务器发送POST请求并获得正确的响应。

注意:有角括号代表占位符。

在终端中,使用以下代码将为我提供所需的响应。

curl -u <user>:<pass> -H 'Content-Type: application/xml' -X POST https://<rest of url>

我目前的PHP看起来像这样:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri); //$uri is the same that I use in terminal
curl_setopt($ch, CURLOPT_USERPWD,
    sprintf('%s:%s', $user, $pass)); //same as terminal user & pass
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$headers = array(
    'Content-Type: application/xml', //expect an xml response
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$curl_result = curl_exec($ch);

使用此PHP,我收到400 Bad Request错误。

详细信息:

> POST <same url> HTTP/1.1
Authorization: Basic YWRtaW5Ac3Bhcms0NTEuY29tOnNwYXJrc29tZXRoaW5n
Host: <correct host>
Accept: */*
Content-Type: application/xml
Content-Length: -1
Expect: 100-continue

* HTTP 1.0, assume close after body
< HTTP/1.0 400 Bad request
< Cache-Control: no-cache
< Connection: close
< Content-Type: text/html

为什么我在使用PHP时遇到400 Bad Request错误,但在使用命令行时却没有?如何解决此问题,以便使用PHP获得所需的响应?

2 个答案:

答案 0 :(得分:3)

curl_setopt($ch, CURLOPT_POSTFIELDS, array());

添加此行后,我解决了我的问题。在某种程度上,这个解决方案是有道理的但我不明白为什么需要CURLOPT_POSTFIELDS。在PHP文档中,这部分应该包含在CURLOPT_POST下,除非这只是意外

答案 1 :(得分:0)

我不知道这是否可以帮到你,但对我来说Expect: 100-continue看起来很奇怪。看一下这个评论:

http://php.net/manual/en/function.curl-setopt.php#82418

所以也许您可以像示例中那样修复它:

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
?>