我正在开发一个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。无论如何,任何帮助将不胜感激。
答案 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'));