我正在尝试编写一些代码来将网页连接到外部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;反对什么,以及我如何能够修复它?
谢谢!
答案 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的提供商来更新其文档。我向其他发现自己处于类似修复程序的人推荐它。