Отладка PHP SOAP вызова - PullRequest
       1

Отладка PHP SOAP вызова

5 голосов
/ 20 октября 2010

Я новичок в 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);

Поиск в Google предполагает, что эта ошибка является проблемой пространства имен.У моего кода C # есть только одна ссылка на пространство имен:

[System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")]

Если я сбросил $ soapclient на экран до вызова функции, я вижу, что он получил данные от eServices.asmx.

Я не уверен, что делать с отладкой, а сотрудники службы не знакомы с взаимодействием со службой вне своей среды .NET IDE.

Есть какие-нибудь мысли?Совет?

Ответы [ 2 ]

8 голосов
/ 20 октября 2010

Я обычно использую методы getFunctions и getLastRequest , чтобы помочь мне разобраться.Сначала я смотрю на список функций и WSDL.Иногда WSDL и / или сервер неправильно настроены / настроены / закодированы.Так что этот список функций может быть бесполезным.Файл WSDL должен быть окончательным, но, увы, неубедительными кодировщиками и т. Д.

Так что иногда мне приходится делать удар в темноте, смотреть на ошибку, а затем смотреть на последний запрос.При этом вы можете увидеть фактический XML, который был произведен.Сравните это с некоторыми работающими примерами XML.

Это оказалось наиболее полезным при работе с программистами, которые не хотят писать документы.Кстати, они должны приводить примеры XML, а не показывать, как генерировать XML с использованием языка XYZ.Может быть более полезная информация в документации PHP / Soap

HTH

0 голосов
/ 16 января 2015

для целей отладки вы можете использовать веб-отладчик 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*/
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...