Я новичок в SOAP и занимаюсь веб-службой, где, казалось бы, никто раньше не взаимодействовал с PHP. У них нет кода примера, кроме C #, но у меня есть это. eServices.asmx предоставляет WSDL, если это правильный способ сказать это.
Ошибка, которую я получаю, – «Сервер не распознал значение HTTP-заголовка SOAPAction:« с этим тренировочным двоеточием, предполагающим, что значение не передано, может быть.
Мой код выглядит так:
$URL = "http://nolaflash.example.com/xxxWS/eServices.asmx"; $namespace="http://www.example.com/webservices/"; include("SOAP/Client.php"); $soapclient = new SOAP_Client($URL); $xml_data = // valid XML is here; $res = $soapclient->UpdateData('usrname','pass',$xml_data);
но я также пробовал:
$param = array('usrname','pass',$xml_data); $res = $soapclient->call('UpdateData',$param, $namespace);
Googling предполагает, что эта ошибка является проблемой пространства имен. Код C #, который у меня есть, имеет только одну ссылку на пространство имен:
[System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")]
Если я выгружаю $ soapclient на экран перед вызовом функции, я вижу, что он получил данные из eServices.asmx.
Я не уверен, как отлаживать это, а сотрудники службы не знакомы с взаимодействием с сервисом вне их. NET IDE.
Есть предположения? Совет?
Обычно я использую getFunctions: http://www.php.net/manual/en/soapclient.getfunctions.php и getLastRequest: http://www.php.net/manual/en/soapclient.getlastrequest.php, чтобы помочь мне сортировать вещи. Сначала я просматриваю список функций и WSDL. Иногда WSDL и / или сервер неправильно настроены / настроены / закодированы. Поэтому этот список функций может оказаться бесполезным. Файл WSDL должен быть окончательным, но, увы, хромовыми кодировщиками и т. Д. …
Поэтому иногда мне приходится наносить удар в темноте, смотреть на ошибку, а затем смотреть на последний запрос. С этим вы можете увидеть фактический XML, который был создан. Сравните это с некоторыми рабочими XML-примерами.
Это оказалось наиболее полезным при работе с кодировщиками, которые не хотят писать документы. Кстати, они должны предоставить примеры XML – не показывать, как создавать XML с использованием языка XYZ. Здесь может быть более полезная информация: http://php.net/manual/en/book.soap.php
НТН
для отладки вы можете использовать веб-отладчик Fiddler. Я нашел это весьма полезным. В эти дни я работаю над проектом, основанным на веб-сервисах .net, и я должен использовать их через PHP. Это рабочий (и очень простой) код. Надеюсь, это может вам помочь. Цель этого фрагмента кода – проверить статус на определенной записи.
Это wsdl
POST /b1synccontext.asmx HTTP/1.1 Host: 00.00.00.0 Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/QueueEntryGetStatus" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <QueueEntryGetStatus xmlns="http://tempuri.org/"> <BuffID>int</BuffID> </QueueEntryGetStatus> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <QueueEntryGetStatusResponse xmlns="http://tempuri.org/"> <QueueEntryGetStatusResult>int</QueueEntryGetStatusResult> </QueueEntryGetStatusResponse> </soap:Body> </soap:Envelope>
Это код php
$client = new SoapClient("http://YOURIP/yourservice.asmx?wsdl",array( 'exceptions'=>true, 'cache_wsdl'=>WSDL_CACHE_NONE, 'encoding'=>'utf-8')); $params = array( 'BuffID' => 134 ); try { $result = $client->QueueEntryGetStatus($params); $status = $result->QueueEntryGetStatusResult; /*do something*/ } catch (Exception $e) { $e -> getMessage(); /*do something*/ }