PHP SoapClient, генерирующий различные отформатированные запросы SOAP - PullRequest
3 голосов
/ 23 февраля 2011

Поэтому я пытаюсь подключиться к стороннему сервису и у меня возникают некоторые проблемы с ним в PHP.Когда я пытаюсь запросить сервис в WebService Studio, он работает нормально, и отправленный запрос выглядит так:

<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <createUser xmlns="http://ws.example.com">
            <arg0 xmlns="">test@test.com</arg0>
            <arg1 xmlns="">123</arg1>
            <arg2 xmlns="">1234</arg2>
            <arg3 xmlns="">1234567890abcdef</arg3>
            <arg4 xmlns="">test</arg4>
            <arg5 xmlns="">user</arg5>
            <arg6 xmlns="">02472</arg6>
            <arg7 xmlns="">test@test.com</arg7>
            <arg8 xmlns="">A</arg8>
            <arg9 xmlns="">0</arg9>
            <arg10 xmlns="">true</arg10>
        </createUser>
    </soap:Body>
</soap:Envelope>

Теперь, когда я пытаюсь вызвать сервис из PHP с помощью следующей команды:

$this->web_service->createAccount('test@test.com', 123, 1234, '1234567890abcdef', 'test', 'user', '12345', 'test@test.com', 'A', 0, true)

и отладив запрос, я получаю следующее:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ws.example.com">
    <SOAP-ENV:Body>
        <ns1:createUser/>
        <param1>123</param1>
        <param2>1234</param2>
        <param3>1234567890abdcef</param3>
        <param4>test</param4>
        <param5>user</param5>
        <param6>12345</param6>
        <param7>test@test.com</param7>
        <param8>A</param8>
        <param9>0</param9>
        <param10>true</param10>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Несколько вещей сразу бросаются в глаза при запросе, сгенерированном SoapClient в PHP.Во-первых, первый параметр (первый раз, когда я передаю test@test.com) не передается в param1, а второй параметр.Следующее, что запрос createUser - это самозакрывающийся тег, не включающий передаваемые параметры.Тогда очевидно, что вся структура немного отличается от используемого тега.

Я попытался использовать массив (который даже не доходит до момента выдачи запроса), оборачивая параметры в SoapParam, используя__call () и использование __soapCall (), но ни одно из них не решает эту проблему.

Кто-нибудь знает, что может решить эту проблему, поэтому запрос, сгенерированный SoapClient в PHP, совпадает с запросом, сгенерированным WebService Studio, если не сгенерировать вручнуюзапрос на мыло от руки?

Ответы [ 2 ]

6 голосов
/ 25 октября 2011

У меня была похожая проблема (с тегом операции самозакрытия)

Оказывается, проблема была в том, как я передавал параметры. Определение из ожидаемых параметров из wsdl было следующим:

<s:element name="ValidateStudent">
<s:complexType>
<s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="studentNumber" type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="surname" type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="dob" type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="clientIP" type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="clientUserAgent" type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="clientReferrer" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>



<wsdl:message name="ValidateStudentSoapIn">
  <wsdl:part name="parameters" element="tns:ValidateStudent" />
</wsdl:message>



<wsdl:operation name="ValidateStudent">
  <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Validation of user credentials to student portal</wsdl:documentation>
  <wsdl:input message="tns:ValidateStudentSoapIn" />
  <wsdl:output message="tns:ValidateStudentSoapOut" />
</wsdl:operation>



<wsdl:operation name="ValidateStudent">
  <soap:operation soapAction="http://test.example.com/ValidateStudent" style="document" />
  <wsdl:input>
    <soap:body use="literal" />
  </wsdl:input>
  <wsdl:output>
    <soap:body use="literal" />
  </wsdl:output>
</wsdl:operation>

Итак, метод ValidateStudent () ожидает один параметр (также называемый ValidateStudent - это определено во втором разделе), который является сложным типом, как определено в первом разделе.

В моем случае я должен был передать параметры следующим образом (как один элемент, обозначенный как ValidateStudent, с подэлементами, названными так, как определено в wsdl):

$soapParams = array('ValidateStudent' => array(
    'studentNumber'     => $stuCode,
    'surname'           => $lastName,
    'dob'               => $dob,
    'clientIP'          => $ip,
    'clientUserAgent'   => $uAgent,
    'clientReferrer'    => $referer
));

$response = $soapClient->__soapCall('ValidateStudent', $soapParams);

Итак, в основном, убедитесь, что вы понимаете определение, изложенное в wsdl, с которым работаете, и придерживаетесь его структуры до T.

0 голосов
/ 23 февраля 2011

Я думаю, что вам лучше использовать массив с именами параметров для индексов

$this->webService->createAccount(array('arg0'=>'test@test.com')...);

или используйте функцию __ soapCall

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...