Php SoapClient 并添加 xmlns url

问题描述

刚开始使用 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
        )
    );

我发送的 PHP 代码非常简单,看起来有点像这样:

$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 服务调用中获取数据的人。