У меня очень простой веб-сервис, который возвращает строку (жестко закодированную при этом). Я продолжаю получать ошибку при анализе полезной нагрузки SOAP: Зарезервированное имя XML.
Я не могу просматривать WSDL без проблем (interal / за брандмауэром, поэтому нет ссылки для предоставления).
Вот частичный дамп клиента NuSOAP после вызова моего метода:
public 'request' => string 'POST myinternalhost.ca/ws.php HTTP/1.0 Host: myinternalhost.ca:443 User-Agent: NuSOAP/0.7.3 (1.114) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "" Content-Length: 510 <?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="htt'... (length=716) public 'response' => string 'HTTP/1.1 200 OK Date: Tue, 19 Jun 2012 18:43:10 GMT Server: Apache/2.0.59 (Win32) DAV/2 mod_ssl/2.0.59 OpenSSL/0.9.8e mod_auth_sspi/1.0.4 PHP/5.2.3 X-Powered-By: PHP/5.2.3 X-SOAP-Server: NuSOAP/0.7.3 (1.114) Content-Length: 470 Connection: close Content-Type: text/xml; charset=ISO-8859-1 <?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-i'... (length=769) public 'responseData' => string ' <?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:vms_ws_list_filesResponse xmlns:ns1="http://tempuri.org"><return xsi:type="xsd:string">SomeText</return></ns1:vms_ws_list_filesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>' (length=470) public 'error_str' => string 'XML error parsing SOAP payload on line 1: Reserved XML Name' (length=59)
В теле SOAP вы можете увидеть «SomeText», который является жестко закодированным контентом, который возвращается из моей веб-службы, которая содержит только один метод:
$server->register('vms_ws_list_files', array('password' => 'xsd:string'), // Password check array('return' => 'xsd:string'), // Output parameters $ns, // namespace $ns . '#vms_ws_list_files', // soapaction 'rpc', // style 'encoded', // use 'Get list of files on disk' // documentation ); ... function vms_ws_list_files($password){ global $site; // Check password if ($password != 'myHardCodedPwdForTesting') { return new soap_fault('Wrong password!', '', ''); } $out = "SomeText"; return $out; }
В моем случае порт 443 не защищен, так как он является внутренним / тестирующим.
Удалите пробелы перед <?xml
а затем это сработает . Если вы не можете, возможно, вы можете изменить / расширить класс nusoap, чтобы trim
ответ перед интерпретацией. Скорее всего, лишние пробелы исходят из некоторых случайных пробелов вне тегов <?php
& ?>
.
Добавление следующей строки в nusoap.php:
$ this-> responseData = trim ($ this-> responseData);
перед этой строкой:
return $ this-> parseResponse ($ http-> incoming_headers, trim ($ this-> responseData));
решил мою проблему
В моем коде это был плохо отформатированный XML, так как на португальском языке BR имеет очень специальные символы, кавычки, не закрывал тег правильно. В конце кода показано, что возврат, XML, сделал проверку на этом сайте: http://www.xmlvalidation.com/, после чего он вернулся к работе.