对PHP Curl请求到SOAP Web服务的请求不正确

时间:2019-03-04 02:16:52

标签: php xml web-services curl soap

这是我使用的方法:

$xml_data = 'XML data';

$headers = array(
"POST /ws_autos.asmx HTTP/1.1",
"Host: (web service url)",
"Content-Type: text/xml; charset=utf-8",
"SOAPAction: \"http://tempuri.org/(web service method)\"",
"Content-length: ".strlen($xml_data)
);

$url = (web service url)?wsdl;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

$reply = curl_exec($ch); 



$xmli = new SimpleXMLElement($reply);


print_r($reply);

print_r($xmli);

执行过程中,我没有得到澄清就收到了错误请求错误。我检查了XML主体是否有错误,但似乎没有,而且据我所知,标头中没有任何异常。

我已经尝试过使用SoapClient,但是在这里没有大量的嵌套信息可以找到构建XML主体的任何文档/资源。

1 个答案:

答案 0 :(得分:2)

您的xml已损坏,严格

DOMDocument :: loadXML是一个非常严格的XML解析器,它说: Warning: DOMDocument::loadXML(): XML declaration allowed only at the start of the document in Entity, line: 2 in /in/EOrYe on line 43

因为: the newline corrupts your XML

您的<?xml声明不是XML中的第一件事。 XML中的第一件事是换行符,然后<?xml就出现了。您可以删除换行符,也可以替换

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

使用

curl_setopt($ch, CURLOPT_POSTFIELDS, trim($xml_data));

也摆脱

"Content-length: ".strlen($xml_data)

因为libcurl会自动为您添加它,而libcurl不会对此犯任何错误(与您不同,如果您进行curl_setopt($ch, CURLOPT_POSTFIELDS, trim($xml_data));,则长度会因修剪而改变,因此总是让curl为您做这件事。)

也摆脱了"POST /ws_autos.asmx HTTP/1.1"

因为:1:curl将为您添加此标头。 和2:您不知道curl是否要使用HTTP / 1.0或HTTP / 1.1或HTTP / 2,如果curl决定在此处使用HTTP / 2,则会破坏请求。(并且curl支持DOES现在使用HTTP / 2,即使它需要nginx库iirc,并且许多服务器的curl构建尚不支持它,但是您不希望您的脚本在curl构建支持HTTP / 2时就神奇地停止工作,对吗?不,你不会。)

也摆脱了"Host: demo.caledoniaseguros.com.ar",

因为curl将为您添加它,只要URL是正确的即可。几乎唯一需要(且应该)手动设置Host:标题的时间是在遇到DNS问题,无法信任DNS或DNS查找时间太慢以至于无法使用时在性能受到打击的情况下,所有这些情况都极为罕见,而且通常只是菜鸟的错误。