这是我使用的方法:
$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主体的任何文档/资源。
答案 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
您的<?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查找时间太慢以至于无法使用时在性能受到打击的情况下,所有这些情况都极为罕见,而且通常只是菜鸟的错误。