Нежелательные строки, прикрепленные в начале и конце ответа SOAP в PHP SoapClient


Я выполняю следующий php-код, пытаясь получить запрос от сервера API SOAP

try {
    $soap = new SoapClient($wsdl, $options);
    $data = $soap->GetXYZ($params);
}
catch(Exception $e) {
    $Lastresponse = $soap->__getLastResponse();
}

Все, что я получил, это код ответа "похоже, у нас нет XML-документа".

Но когда я посмотрел на переменную $Lastresponse в блоке catch, я нашел ее, как показано ниже:

------=_Part_1134075_393252946.1482317378966 Content-Type: application/xop+xml; charset=utf-8; type="text/xml" <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> ......all valid data ... </SOAP-ENV:Body> </SOAP-ENV:Envelope> ------=_Part_1134075_393252946.1482317378966--

Примечание: параметры $options, которые я использую, следующие:

$options = array(
    'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
    //'style'=>SOAP_RPC,
    //'use'=>SOAP_ENCODED,
    'soap_version'=>SOAP_1_1,
    'cache_wsdl'=>WSDL_CACHE_NONE,
    'connection_timeout'=>15,
    'trace'=>true,
    'encoding'=>'UTF-8',
    'exceptions'=>true
);

Хотя я сделал обходной путь для анализа xml, у кого-нибудь есть какие-либо идеи об этих дополнительных битах? Есть что-то я делаю не так?

Author: Ashok Poudel, 2016-12-21

3 answers

Эти -----Part вещи называются границей в составных сообщениях, объясненных здесь и определенных в RFC2387.

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

Решение состоит в том, чтобы расширить SoapClient для извлечения содержимого XML с помощью регулярных выражений или других строковых функций. Вот пример из этой страницы:

class MySoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) { 
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        $start = strpos($response,'<?xml'); 
        $end = strrpos($response,'>'); 
        return substr($response,$start,$end-$start+1);
    }
}
 5
Author: Rei, 2017-05-23 12:25:51

Запрашиваю вас попробовать использовать следующий запрос

            $headers = array(
            "POST: ".url." HTTP/1.1",
            "Host: ".domain."",
            "Accept-Encoding: gzip,deflate",
            "Content-type: text/xml;charset=UTF-8",
            "SOAPAction: \"http://tempuri.org/wsdlurl/methodname\"",
            "Connection: Keep-Alive",
            "Content-length:".strlen($xml),
            "User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
            "
            )

    $url = your url;
    $ch = curl_init();      
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_ENCODING, '');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $options); // the SOAP request
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);     
    $response = curl_exec($ch);
    $err = curl_error($ch);
    $doc = new DOMDocument();
    $doc->loadXML( $response );     
    $authKey = $doc->getElementsByTagName( "fieldname" );
 2
Author: Nishant Nair, 2016-12-31 14:23:16

Вы должны поймать исключение:

SoapClient::SoapClient() выдаст ошибку E_ERROR, если параметры местоположения и uri не указаны в режиме, отличном от WSDL.

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

 2
Author: Ravshan Abdulaev, 2017-01-02 17:02:01