SOAP-ERROR: Кодирование: нарушение правил кодирования?

Ребята, я застрял, ударив головой из-за стола в течение последних нескольких часов.

Я пытаюсь использовать службу, и у меня есть еще 8 других функций, которые я называю почти идентичными по своему характеру, но это приводит к ошибке «Ошибка SOAP-ERROR: кодирование: нарушение правил кодирования».

Heres вызов функции (wsdl пропущен для обеспечения безопасности):

function CanLoadProduct($data){ $client = new SoapClient('wsdl-url'); $params = array('username' => $this->username, 'password' => $this->password, 'prod' => $data['productid'], 'mdn' => $data['mdn']); try { $reply = $client->__soapCall("CanLoadProduct", $params); } catch (Exception $e) { echo 'Error: ', $e->getMessage(), "\n"; print_r($params); die(); } if( $reply['result'] == 1 ){ return TRUE; // 1 = true } else { return FALSE; } } 

Итак, эта функция, подключается к веб-сервису, необходимыми элементами являются: имя пользователя, пароль, prod, mdn, все 4 из которых я поставляю как часть массива $ params. Имя пользователя / пароль определены раньше и работают нормально, так как остальные 8 функций без проблем обрабатывают веб-службу.

Массив $ data [] (который я передаю функции) содержит: $ data ['productid'] $ data ['mdn'] ничего не используется.

я осознаю

 SOAP-ERROR: Encoding: Violation of encoding rules 

по какой-то необъяснимой причине, и Гуглинг эта ошибка не дает мне нигде. Кто-нибудь еще сталкивается с этим? Запуск PHP 5.2.9-2. Странно то, что эта функция идентична этой функции, которая работает на 100%:

  function GetPIN($productid){ $client = new SoapClient('wsdl-url'); $params = array('username' => $this->username, 'password' => $this->password, 'prod' => $productid); try { $reply = $client->__soapCall("GetPIN", $params); } catch (Exception $e) { echo 'Error: ', $e->getMessage(), "\n"; die(); } return $reply; } 

Вот WSDL (должен был опубликовать это в первую очередь):

 <?xml version="1.0" encoding="ISO-8859-1"?> <definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="ready:test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="ready:test"> <types> <xsd:schema targetNamespace="ready:test" > <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> </xsd:schema> </types> <message name="CanLoadProductRequest"> <part name="username" type="xsd:string" /> <part name="password" type="xsd:string" /> <part name="prod" type="xsd:string" /> <part name="mdn" type="xsd:string" /> <part name="esn" type="xsd:string" /></message> <message name="CanLoadProductResponse"> <part name="result" type="xsd:int" /></message> <portType name="CanLoadProductPortType"> <operation name="CanLoadProduct"> <input message="tns:CanLoadProductRequest"/> <output message="tns:CanLoadProductResponse"/> </operation> </portType> <binding name="CanLoadProductBinding" type="tns:CanLoadProductPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="CanLoadProduct"> <soap:operation soapAction="{url-removed}" style="rpc"/> <input> <soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <service name="CanLoadProduct"> <port name="CanLoadProductPort" binding="tns:CanLoadProductBinding"> <soap:address location="{url-removed}"/> </port> </service> </definitions> 

Похоже, что у вас есть несоответствие типа где-то, либо при сборке вашего запроса (один из параметров не относится к строке типа), либо сервер возвращает что-то иное, чем int (нарушая определение ответа WSDL и тем самым заставляя клиента рассматривать ответ недействителен, так как он ожидает чего-то еще).

  • Чтобы проверить первый случай, убедитесь, что все параметры сначала заданы для строки
  • Чтобы проверить второй случай, создайте свой SoapClient с параметром trace, установленным в true, чтобы получить доступ к фактическому XML-ответу с сервера через $ client -> __ getLastResponse () после этого (вы можете использовать это для отладки запроса также через __getLastRequest ( )).

Некоторые дополнительные замечания / вопросы:

  • Согласно опубликованному WSDL, «CanLoadProductRequest» имеет пятый параметр «esn», который вы не предоставляете в своем вызове функции.
  • Любая причина, по которой вы используете $client->__soapCall("CanLoadProduct", $params) вместо $client->CanLoadProduct($username, $password, etc.) ? (Первая версия представляет собой вариант более низкого уровня, который предназначен для использования в сценариях, отличных от non_WSDL. Вторая версия может дать вам более подробную ошибку / исключение)
  • Можете ли вы протестировать вызов SOAP на CanLoadProductRequest другими способами? Ошибка может быть на стороне сервера, пытаясь вернуть тип результата, который не соответствует определению WSDL.

У меня такая же проблема.

В настройках soapUI я проверил параметр «Настройки» → «Параметры редактора» → «Проверить ответы», и я получил эту информацию:

строка 3027: Недопустимое десятичное значение: неожиданный символ '44'.

Это решило мою проблему. Поле содержит неправильное значение типа.

У меня была такая же проблема при попытке передать XML в качестве параметра в один из моих веб-сервисов. Обтекание XML-данных в <![CDATA[ ... ]]> избавилось от SOAP-ERROR: Кодирование: нарушение правил кодирования и все работало нормально.

Другие детали:
1. Параметр был также определен как xsd: string.
2. WSDL был документом / буквальным.
3. Использование встроенного SOAP-класса с php 5.2.10.

У меня была та же проблема, и я решил использовать этот синтаксис для __soapCall :

 ... $params = new SoapParam($data, 'parameters'); $response = $this->__soapCall('methodName', array(new SoapVar($data, XSD_ANYTYPE, 'parameters')) ); ... 

Вместо

 __soapCall('methodName', array($params) 

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

Там также есть своего рода ошибка на PHP, где неправильный тип не оставляет места для возврата правильного SOAP-файла обратно клиенту.

http://bugs.php.net/bug.php?id=50547

 <![CDATA[<?xml version="1.0" encoding="utf-8"?> <CONTENTXML></CONTENTXML]]></xmlCallString>]]> 

У меня была та же проблема, и мне удалось исправить ее, исправив WSDL, который предполагал, что сервер отправит целое число для определенного значения, но фактически отправил строку. Возможно, изменение WSDL:

 <part name="result" type="xsd:int" /></message> 

в

 <part name="result" type="xsd:string" /></message> 

Могу решить вашу проблему, вот некоторая информация о конкретном случае, с которым я столкнулся: https://blog.dotnetframework.org/2016/12/06/uncaught-soapfault-exception-sender-soap-error-encoding-violation-of -Кодирование-правила /

У меня была эта проблема в PhpStorm при выполнении модульных тестов. Я отключил кеш wsdl и работал: ini_set ("soap.wsdl_cache_enabled", "0");