Удалить символ спецификации из ответа мыла: SOAP: похоже, мы не получили XML-документ

Привет, я начинаю создавать веб-сервисы,

Я пытаюсь создать веб-службу с использованием протокола мыла, и я продолжаю получать следующую ошибку: похоже, у нас нет XML-документа.

Вот ниже мой веб-сервис и вывод ответа. Как вы увидите, я получаю символ bom () в начале ответа.. я думаю, что это основная причина ошибки, которая указывает, что xml недействителен. Пожалуйста, есть ли способ чтобы удалить этот символ из моего клиента. поэтому я замечаю, что пытался переопределить метод _doRequest для SoapClient, но безуспешно. Мой файл wsdl и серверный скрипт закодированы в UTF-8 без спецификации.

Любая помощь в решении этой проблемы будет очень признательна.

С Уважением.

клиент:

try{
    ini_set("soap.wsdl_cache_enabled", "0");// disabling WSDL cache
    libxml_disable_entity_loader(false);
    if(!extension_loaded("soap")){ dl("php_soap.dll");  }
    $client2 = new SoapClient("http://www.payafrik.com/PayAfrikAPI.wsdl",array("wsdl_cache"=>0,"trace"=>1,"exception"=>1));
    $slabrequest["email"]  = "[email protected]";
    $slabrequest["description"] = "test";
    $slabrequest["montant"]    = 50000;
    $client2->slabAccount($slabrequest);
}catch(Exception $e){ 
    var_dump( $e ); 
    echo "<pre>"; echo "Request :<br/>", htmlentities($client2->__getLastRequest()), "<br/>"; 
    echo "Response :<br/>", htmlentities($client2->__getLastResponse()), "<br/>";echo "</pre>";
}   

.. Выход Ответ: <сильный> ï »¿ï» ¿ï »¿ repSUCCESSuser4MonsieurGNACADJALoic 1RUE 1382LITTORAL1229COTONOU22921332680229972461401987-03-26loic.gnacadja@gmail.com646260ea6e66c61704c695e617f9b74alogin1309625000011242015-07-12 23:50:30


person Kakou    schedule 13.07.2015    source источник


Ответы (1)


Это немного старый вопрос, но у него была такая же проблема, поэтому я оставлю свое решение этой проблемы на случай, если Google направит кого-то сюда :)

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

Решение, которое сработало для меня

Установив для трассировки SoapClient значение true и вызвав SoapClient::__getLastResponse Я обнаружил, что интересующая меня часть начинается с ‹s:Envelope. Чтобы избавиться от лишних, ненужных данных, пришлось расширить SoapClient, чтобы сократить только необходимая информация, и пусть SoapClient сделает все остальное с допустимым результатом.

В итоге получилось что-то вроде этого:

class WSDLSoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $response = parent::__doRequest( $request, $location, $action, $version );
        if (!$response) {
            return $response;
        }
        // Cut only part that is a SOAP result
        $matches = array();
        preg_match('/<s:Envelope.*<\/s:Envelope>/s', $response, $matches);
        return $matches[0];
    }
}

Надеюсь, это поможет, Ура

person Marcin Waśniowski    schedule 04.05.2017