"版本不匹配"使用SOAP和php连接到API

时间:2016-12-16 20:08:17

标签: php curl soap

我正在尝试编写一些代码来将网页连接到外部API。 API的文档告诉我,请求应该使用SOAP信封完成,该信封应如下所示:

<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<soap:Body>
  <GetNote>
    <Request>
      <Security>
        <Username>username</Username>
        <Password>password</Password>
      </Security>
      <NoteID>noteID</NoteID>
    </Request>
  </GetNote>
</soap:Body>
</soap:Envelope>

使用由有用的StackOverflow用户创建的一些示例代码:SOAP request in PHP with CURL然后我把它变成了这个(略微编辑)的php:

<?php
$soapUrl = 'https://www.blah.com/DoodadService.cfc?wsdl';
$xml_post_string = '<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<soap:Body>
  <GetNote>
    <Request>
      <Security>
        <Username>'.$soapUser.'</Username>
        <Password>'.$soapPassword.'</Password>
      </Security>
      <NoteID>'.$soapNoteID.'</NoteID>
    </Request>
  </GetNote>
</soap:Body>
</soap:Envelope>';

$headers = array(
                        "Content-type: text/xml;charset=\"utf-8\"",
                        "Accept: text/xml",
                        "Cache-Control: no-cache",
                        "Pragma: no-cache",
                        "SOAPAction: https://www.blah.com/DoodadService.cfc?wsdl",
                        "Content-length: ".strlen($xml_post_string),
                    );

$url = $soapUrl;


$ch = curl_init();
echo('set curl<br>');
$f = fopen('request.txt','w');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $soapUser.":".$soapPassword);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_VERBOSE,true);
curl_setopt($ch, CURLOPT_STDERR, $f);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
echo('about to execute<br>');
// converting
$response = curl_exec($ch);
fclose($f);
echo('Got '.strlen($response).' characters in response<br>');
curl_close($ch);
echo('Saved error strings to request.txt<br> ');
?>

结果是版本不匹配错误,即:

<soapenv:Fault>
<faultcode>
soapenv:VersionMismatch</faultcode>
<faultstring>
Version Mismatch</faultstring>
<detail>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">
ip-10-4-4-149</ns1:hostname>
</detail>
</soapenv:Fault>

任何人都可以告诉我这个错误意味着什么,正在发生什么,不匹配&#34;反对什么,以及我如何能够修复它?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试将Content-type标头更改为SOAP + XML内容。 charset不需要引用。

"Content-type: application/soap+xml; charset=utf-8"

否则,你肯定错过了一些你不知道的事情。 您可以在另一个SO问题中找到一些使用此API的示例或使用SOAP的类似案例。

答案 1 :(得分:0)

事实证明,问题是“在线手册提供过时信息”。毕竟不是普通SOAP专家可以帮助解决的问题!

在与API提供商协商的过程中,指出了一个有用的工具SoapUI - https://www.soapui.org/ - 事实证明,它可用于根据API的URL生成正确的Soap信封 - 这意味着我是不再依赖此API的提供商来更新其文档。我向其他发现自己处于类似修复程序的人推荐它。