Добавьте значение xmlns в ответ Symfony2 SoapServer - PullRequest
4 голосов
/ 14 января 2020

Мы создали службу SOAP для получения запроса, однако в ответ необходимо включить дополнительное значение, и мы не знаем, как его добавить.

Нам нужно добавить xmlns="http://some-url.co.uk/" в это: <SOAP-ENV:PrintLocationResponse>, чтобы оно выглядело так: <SOAP-ENV:PrintLocationResponse xmlns="http://some-url.co.uk/">

SOAP Служба получает этот запрос:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <PrintLocation xmlns="http://some-url.co.uk/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <alertMsg>
                [ some message goes here]
            </alertMsg>
        </PrintLocation>
    </s:Body>
</s:Envelope>

Служба SOAP отвечает следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:PrintLocationResponse>
            <PrintLocationResult>
                Message contents goes here
            </PrintLocationResult>
        </SOAP-ENV:PrintLocationResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Нам необходимо добавить xmlns="http://some-url.co.uk/" к этой части ответа: <SOAP-ENV:PrintLocationResponse>, чтобы ответ был таким:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:PrintLocationResponse xmlns="http://some-url.co.uk/">
            <PrintLocationResult>
                Message contents goes here
            </PrintLocationResult>
        </SOAP-ENV:PrintLocationResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Мы не знаем, как добавить xmlns="http://some-url.co.uk/" в ответ выше.

Контроллер, управляющий запросом и ответ возвращается следующим образом:

    public function indexAction(Request $request)
    {

        $soapServer = new \SoapServer('wsdl/hello.wsdl');
        $soapServer->setObject($this->get('hello_service'));

        $response = new Response();
        $response->headers->set('Content-Type', 'text/xml; charset=ISO-8859-1');

        ob_start();
        $soapServer->handle();

        return $response;

    }

Этот $soapServer = new \SoapServer('wsdl/hello.wsdl'); вызывает hello.wsdl , который выглядит следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions
             xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             >

    <wsdl:message name="helloIn">
        <part name="alertMsg" type="xsd:string" />
    </wsdl:message>

    <wsdl:message name="helloOut">
        <part name="PrintLocationResult" type="xsd:string" />
    </wsdl:message>

    <wsdl:portType name="hellowsdlPortType">
        <wsdl:operation name="PrintLocation">
            <wsdl:input message="tns:helloIn"/>
            <wsdl:output message="tns:helloOut"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="hellowsdlBinding" type="tns:hellowsdlPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="PrintLocation">

            <soap:operation soapAction="http://some-url.co.uk/PrintLocation" style="rpc"/>

            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>

        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="hellowsdl">
        <wsdl:port name="hellowsdlPort" binding="tns:hellowsdlBinding">
            <soap:address location="http://backoffice.system/soap" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Приведенный выше WSDL является немного загадки для нас. Мы исправили пример, найденный здесь: https://symfony.com/doc/2.7/controller/soap_web_service.html

Этот $soapServer->setObject($this->get('hello_service')); вызывает HelloService. php, который выглядит так:

class HelloService
{
    /**
     * @var EntityManager
     */
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function PrintLocation($msg)
    {
        $log = new TempIressMsgThree($msg);
        $xml = simplexml_load_string($log->getMsg());
        $json = json_encode($xml);
        $array = json_decode($json,TRUE);

        $xml='<?xml version="1.0" encoding="UTF-8"?>
                <message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.origoservices.com">
                    <m_control>
                       Response message contents goes here.
                    </m_control>
                </message>';

        return $xml;
    }

Может кто-нибудь помочь?

Чтобы уточнить, нам нужно добавить xmlns="http://some-url.co.uk/" в это: <SOAP-ENV:PrintLocationResponse>, чтобы оно читалось следующим образом <SOAP-ENV:PrintLocationResponse xmlns="http://some-url.co.uk/">

1 Ответ

0 голосов
/ 20 января 2020
header("Content-type: text/xml");

$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:PrintLocationResponse>
<PrintLocationResult>
Message contents goes here
</PrintLocationResult>
</SOAP-ENV:PrintLocationResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML;

$content = simplexml_load_string($string,'SimpleXMLElement',LIBXML_NONET);

foreach($content->getDocNamespaces(TRUE) as $shortcut=>$namespace){
    $content->registerXPathNamespace($shortcut,$namespace );
}

$PLR = $content[0]->xpath('//SOAP-ENV:PrintLocationResponse');

foreach($PLR as $response){
    $response->addAttribute('xmlns', 'http://some-url.co.uk/');
}

echo $content[0]->asXML();
...