问题描述
刚开始使用 Soap,但我需要了解发生了什么,因为我无法解决这个问题。
我需要为我的代码添加两个命名空间才能工作。我这辈子都做不到。
这是我需要添加的命名空间:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:cour="http://schemas.datacontract.org/2004/07/CourierServiceLibrary">
这是我发送的内容:
$xml = array(
'CLIENT_GUID' => 'GUID','Destination' => array(
'Country2LetterCode' => 'PM','TownCity' => 'tiwb','PostCode' => 'AA112BB','NonDocFlag' => false,'ImportFlag' => false
),'PackageDimensionsMetric' => array(
'NumberOfPackages'=> 1,'Weight' => 9,'Length' => 9,'Width' => 9,'Height' => 9
)
);
$soapclient = new SoapClient('http://webservice.com/Service.svc?WSDL');
$response = $soapclient->Comparison($xml);
我收到了回复,但由于我似乎无法添加名称空间,返回的内容无法读取。
我曾尝试发送完整 XML 的原始文本版本,但由于服务器每次都拒绝它而失败。有很多旧论坛都谈到了这一点,但我尝试过的解决方案都没有。
但我确实读过一篇文章说 SoupClient 无法使用,这可以追溯到 2013 年。实际上是否仍然如此,这就是我无法添加 NameSpace 的原因?
注意:使用 SoupUI,它似乎实际上发送了整个原始 xml,其中已经包含 xmlns。但是当我尝试时它失败了。
非常感谢任何帮助,因为我不明白为什么它在 SoupUI 中不起作用。但我之前在任何项目中都没有使用过 Soup。
解决方法
只是为了结束这个问题。我真的不认为这是问题的答案。但它确实通过使用 CURL 解决了我遇到的问题。
$xml_post_string = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"';
$headers = array(
"Content-type: text/xml;charset=\"utf-8\"","Cache-Control: no-cache","Accept: application/xml","Pragma: no-cache","SOAPAction: http://tempuri.org/************/***********","Content-length: " . strlen($xml_post_string),); //SOAPAction: your op URL
$url = $soapUrl;
// PHP cURL for https connection with auth
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$soapUrl);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml_post_string); // the SOAP request
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
// converting
$response = curl_exec($ch);
if (curl_exec($ch) === false) {
echo 'Curl error: ' . curl_error($ch);
} else {
echo 'Operation completed without any errors';
}
curl_close($ch);
echo "<hr>";
我希望这可以帮助那些可能不熟悉 XML 并了解如何从 Web 服务调用中获取数据的人。