Я создал веб-сервис и использовал soapUI, чтобы убедиться, что он работает правильно. Однако при попытке доступа к нему клиент PHP получает фатальную ошибку.
У меня есть настройка try / catch, поэтому я могу просмотреть выходной SOAP-запрос и сделать var_dump
. Когда я просматриваю запрос и var_dump
, он показывает его как все строчные (даже пользовательский заголовок я набрал XML для ручного).
Я знаю, что XML чувствителен к регистру, и когда я вернул запрос в soapUI и правильно изменил его, я получаю правильный ответ от веб-службы.
Что может заставить запрос SOAP изменить все на нижний регистр?
//The WSDL url $wsurl = "http://domain:port/mywebservice.wsdl"; //Custom header setup $ws_username = 'myuser'; $ws_password = 'mypass'; $ws_authheader = '<wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>'.$ws_username.'</wsse:Username> <wsse:Password>'.$ws_password.'</wsse:Password> </wsse:UsernameToken> </wsse:Security>'; //XML SOAP Security variable $ws_authvars = new SoapVar($ws_authheader,XSD_ANYXML); //SOAP Security header $ws_header = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security",$ws_authvars); //SOAP client - trace is set to true so faults can be backtraced $ws_client = new SoapClient($wsurl, array('trace'=>true)); //SOAP client parameters $params = array('PARAM1'=>'123456', 'PARAM2'=>'ABCDE', 'PARAM3'=>'ABCD'); try { //SOAP response $messages = $ws_client->__soapCall('WSMETHOD',array('parameters'=>$params),NULL, $ws_header); //print_r($messages); } catch (SoapFault $fault) { echo "\n"; print_r($ws_client->__getLastRequest()); echo "\n"; var_dump($ws_client); }
Мой __getLastRequest возвращает это (обратите внимание, что значения полей остаются в соответствующем случае):
<!--?xml version="1.0" encoding="UTF-8"?--> <soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="mynamespaceurl" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <soap-env:header> <wsse:security soap:mustunderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:usernametoken> <wsse:username>myuser</wsse:username> <wsse:password>mypass</wsse:password> </wsse:usernametoken> </wsse:security> </soap-env:header> <soap-env:body> <ns1:wsmethod> <ns1:param1>123456</ns1:param1> <ns1:param2>ABCDE</ns1:param2> <ns1:param3>ABCD</ns1:param3> </ns1:wsmethod> </soap-env:body> </soap-env:envelope>
Точный SoapFault:
SoapFault exception: [SOAP-ENV:Server] null in C:\inetpub\wwwroot\mydirs\mypage.php:458 Stack trace: #0 C:\inetpub\wwwroot\mydirs\mypage.php(458): SoapClient >__soapCall('wsmeth...', Array, NULL, Object(SoapHeader)) #1 {main}
Строкой, указывающей (458), является $ messages = $ ws_client -> __ soapCall