Как я могу изменить пространства имен SOAP в PHP, чтобы они соответствовали WSDL? - PullRequest
1 голос
/ 18 апреля 2011

В настоящее время я работаю над проектом для компании, в которой я работаю.Проект должен будет сделать SOAP-запрос другой компании (с помощью PHP).В моем PHP-коде SoapClient взаимодействует с SOAP-сервером другой компании, но все, что я получаю, это «INVALID XML».Изучив их WSDL и ответ, я заметил, что их пространства имен разные.Мне нужно изменить свои пространства имен, чтобы они соответствовали их.

Например: теги в моем запросе показывают "ns1".и "env.", но у них "мыло".

Как я могу это изменить?

Вот пример моего кода, отправленного запроса и ответа, которыйполучил.

---------------- CODE ----------------

  $client = new SoapClient("http://ws.example.com/test/test.asmx?WSDL", array('soap_version'=>SOAP_1_2, 'trace' => 1));

  $result = $client->TestFunction(array('Packet'=>'<Email>test@example.com</Email><Password>examplepassword</Password>'));

  $sessionid = $result->TestFunctionResult;

  print $sessionid;


  echo "REQUEST HEADER:\n" . htmlentities($client->__getLastRequestHeaders()) . "\n";

  echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";

  echo "RESPONSE HEADER:\n" . htmlentities($client->__getLastResponseHeaders()) . "\n";

  echo "RESPONSE:\n" . htmlentities($client->__getLastResponse()) . "\n";


------------ REQUEST SENT -------------

POST /test/test.asmx HTTP/1.1
Host: ws.example.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.4
Content-Type: application/soap+xml; charset=utf-8; action="http://ws.example.com/test/TestFunction"
Content-Length: 352

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ws.example.com/resumes/">
  <env:Body>
    <ns1:TestFunction>
      <ns1:Packet>
        <Email>test@example.com</Email>
        <Password>examplepassword</Password>
      </ns1:Packet>
    </ns1:TestFunction>
  </env:Body>
</env:Envelope>

---------- RESPONSE RECEIVED ----------

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 450
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-PBY: BEARWS2
Date: Mon, 18 Apr 2011 15:33:51 GMT
Connection: close

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <TestFunctionResponse xmlns="http://ws.example.com/test/">
      <TestFunctionResult>
        <Packet>
          <Error>Invalid XML</Error>
        </Packet>
      </TestFunctionResult>
    </TestFunctionResponse>
  </soap:Body>
</soap:Envelope>

Как обойти эту проблему?

Ответы [ 2 ]

5 голосов
/ 18 апреля 2011

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

<ns1:TestFunciton>
    <ns1:Packet>
        <Email>test@example.com</Email>
        <Password>examplepassword</Password>
    </ns1:Packet>
</ns1:TestFunction>

Обратите внимание на орфографическую ошибку TestFunciton.

0 голосов
/ 13 октября 2012

Интересно, почему вы вставляете теги XML в качестве значений «Пакета».Если все сделано правильно (извините, что я не могу проверить это сам в это время), SoapClient должен экранировать их как сущности, которые уничтожат ваш запрос.Кроме того, мне интересно, почему дамп запроса не показывает это более правильно, но я предполагаю, что это может быть связано с тем, что вы редактировали материал вместо копирования и вставки.

Если все сделано правильно, я предполагаю, что ваш запросдолжно выглядеть так:

$client->TestFunction(
    array(
        'Packet'=> array(
            'Email' => 'test@example.com', 
            'Password' => 'examplepassword',
        )
    )
);
...