SOAP-ERROR: Кодировка: Нарушение правил кодирования? - PullRequest
3 голосов
/ 12 апреля 2011

Я пытаюсь использовать Yii для предоставления веб-сервиса. Сгенерированный wsdl ниже. Я могу успешно использовать веб-сервис из командной строки, но через веб-браузер я получаю

SOAP-ERROR: Encoding: Violation of encoding rules

Я новичок в SOAP, поэтому я не уверен, как решить проблему. Вот код PHP, который я использую для использования веб-службы:

<code><?php
    $client=new SoapClient('{url omitted for security}',
        array('trace'=>1,'exceptions'=>1));
    try {
        $result = $client->getPerson(90043412);
        var_dump($result);
    } catch (SoapFault $fault) {
        echo $fault->getMessage() . '<br />';
        echo 'REQUEST <br />';
        echo '<pre>';
        echo $client->__getLastRequestHeaders();
        echo $client->__getLastRequest();
        echo '
'; echo 'RESPONSE
'; echo '
';
        echo $client->__getLastResponseHeaders();
        echo $client->__getLastResponse();
        echo '
'; echo 'TRACE
'; echo '
';
        var_dump($fault->getTrace());
        echo '
'; } ?>

Вот WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:PersonControllerwsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" name="PersonController" targetNamespace="urn:PersonControllerwsdl">
    <wsdl:types>
        <xsd:schema targetNamespace="urn:PersonControllerwsdl">
            <xsd:complexType name="Person">
                <xsd:all>
                    <xsd:element name="PIDM" type="xsd:integer"/>
                    <xsd:element name="FirstName" type="xsd:string"/>
                    <xsd:element name="MiddleName" type="xsd:string"/>
                    <xsd:element name="LastName" type="xsd:string"/>
                    <xsd:element name="PrefFirstName" type="xsd:string"/>
                    <xsd:element name="CPOBox" type="xsd:string"/>
                    <xsd:element name="Classification" type="xsd:string"/>
                    <xsd:element name="Email" type="xsd:string"/>
                    <xsd:element name="PhotoFile" type="xsd:string"/>
                </xsd:all>
            </xsd:complexType>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="getPersonRequest">
        <wsdl:part name="PIDM" type="xsd:int"/>
    </wsdl:message>
    <wsdl:message name="getPersonResponse">
        <wsdl:part name="return" type="tns:Person"/>
    </wsdl:message>
    <wsdl:portType name="PersonControllerPortType">
        <wsdl:operation name="getPerson">
            <wsdl:documentation></wsdl:documentation>
            <wsdl:input message="tns:getPersonRequest"/>
            <wsdl:output message="tns:getPersonResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="PersonControllerBinding" type="tns:PersonControllerPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="getPerson">
            <soap:operation soapAction="urn:PersonControllerwsdl#getPerson" style="rpc"/>
            <wsdl:input>
                <soap:body use="encoded" namespace="urn:PersonControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="encoded" namespace="urn:PersonControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="PersonControllerService">
        <wsdl:port name="PersonControllerPort" binding="tns:PersonControllerBinding">
            <soap:address location="https://localhost/whoswho/person/service?ws=1"/>
        </wsdl:port>
    </wsdl:service>
</definitions> 

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

Возможно, что SOAP-запрос неверно отформатирован.Я использовал SoapUI и по умолчанию все параметры установлены на «?»Первоначально, если вы сделаете этот запрос, PHP потерпит неудачу и ответит сообщением об ошибке, о котором вы сообщили.Вы не можете перехватить это, потому что не генерируется исключение, это потому, что это фатальная ошибка.

Вы можете установить собственный обработчик ошибок для этой ситуации, используя функцию set_error_handler () http://php.net/manual/en/function.set-error-handler.php

2 голосов
/ 29 сентября 2016

Я работал над обновлением версии PHP до 5.6.26, и эта ошибка появлялась при вызовах моих веб-служб. Через некоторое время я обнаружил, что проблему можно исправить, комментируя в файле PHP.ini следующую строку:

;always_populate_raw_post_data = -1

При просмотре документации эта опция устарела в этой версии.

Надеюсь, этот комментарий сэкономит кому-то время.

1 голос
/ 02 февраля 2012

Я знаю, что это старая тема, но если вы столкнетесь с ней, как я пытался выяснить эту проблему, вы можете попробовать установить адрес soap: http://127.0.0.1 вместо http://localhost. Я наткнулся на несколько других форумов, где это помогло.

1 голос
/ 13 апреля 2011

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

...