繁体   English   中英

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

[英]Bad Request on PHP Curl request to SOAP web service

这是我使用的方法:

$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主体的任何文档/资源。

严格来说,您的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中的第一件事是换行符,然后是<?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));则长度将改变因为修剪,所以几乎总是让卷曲为您做。)

也摆脱了"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会在您输入正确的网址后为您添加它。 几乎唯一需要(并且应该)设置Host: -header手动是在遇到DNS问题,您无法信任DNS或DNS查找时间太慢以至于无法承受性能损失时,所有这些情况都是极为罕见的,而且通常只是菜鸟的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM