PHP CURL PUT等效于命令行

时间:2016-03-24 17:07:03

标签: php xml curl

我正在开发一个PHP Web服务,它将对应用程序API进行REST调用。我的webservice建立在运行ubuntu的LAMP服务器上,以下命令在命令行中运行良好:

  

curl -k -u username -H“Content-type:application / xml”-X PUT -d @ request.xml https://server/path/

但是,当我尝试在PHP中构建相同的请求时,我从REST服务器获得以下响应,表明缺少XML:

  

HTTP400Premature文件结尾。

以下是我的PHP请求的代码:

$ch2 = curl_init($service_url);
$headers = array('Content-Type: application/xml', 'Accept: application/xml');
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch2, CURLOPT_PUT, 1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch2, CURLOPT_POSTFIELDS, $xmlRequest);
curl_setopt($ch2, CURLOPT_USERPWD, 'user:password');
$curl_response = curl_exec($ch2);

我读过的所有内容都表明CURLOPT_POSTFIELDS是执行此操作的地方,但我认为这是为了添加“?”变量到实际的URL。无论如何,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据manual,如果你使用 CURLOPT_PUT ,你还应该提供 CURLOPT_INFILE CURLOPT_INFILESIZE

也许代替

curl_setopt($ch2, CURLOPT_POSTFIELDS, $xmlRequest);

curl_setopt($ch2, CURLOPT_INFILE, fopen('request.xml', 'r'));
curl_setopt($ch2, CURLOPT_INFILESIZE, filesize('request.xml'));