Могу ли я изменить заголовки http, отправленные с помощью SOAP-запроса - PullRequest
1 голос
/ 15 ноября 2010

У меня проблемы с включением сжатия SOAP, и после прочтения документации для службы я понял, что они решили игнорировать стандарт HTTP и делают свое дело.

В основном мне нужно иметь возможность установить заголовок кодирования контента на:

Content-Encoding: accept-gzip,accept-deflate

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

Content-Encoding: gzip

Что приводит к тому, что клиент SOAP генерирует исключение, говорящее "Unknown Content-Encoding".

Так можно ли изменить HTTP-запрос, отправляемый с использованием стандартного клиента php SOAP?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2014

Может это кому-нибудь поможет:

$mode = array (
        'soap_version'  => 'SOAP_1_1', // use soap 1.1 client
        'keep_alive'    => true,
        'trace'         => 1,
        'encoding'      =>'UTF-8',
        'compression'   => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE,
        'exceptions'    => true,
        'cache_wsdl'    => WSDL_CACHE_NONE,
        'stream_context' => stream_context_create ( 
            array (
                'http' => array('header' => 'Content-Encoding: XXXXXXX'),
            )
        )
    );

    // initialize soap client
    $client = new LoEnvioSoapClient ( $this->wsdl, $mode );
0 голосов
/ 14 ноября 2012

Можно изменить используемые заголовки HTTP, но только путем расширения собственного класса PHP SoapClient.

Примерно так:

class MySoapClient extends \SoapClient
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        //Send the HTTP request and get the response using curl or fsockopen,
        //of course setting Content-Encoding to accept-gzip,accept-deflate.
        //Also set Accept-Encoding to deflate
        //Put the response in a variable called $response

        //Set the headers used for this request; this is how you would do it if you used curl:
        $this->__last_request_headers = curl_getinfo($curlHandle, CURLINFO_HEADER_OUT);

        $this->__last_request = $request;

        //decompress the response
        $response = gzinflate( substr($response, 10, -8) );

        return $response;
    }
}

Кажется, что OP уже знает об этом, но вот совет для других, которые могут не знать об этом: чтобы увидеть SOAP-запрос, как он будет отправлен родным классом PHP SoapClient, установите 'trace' опция к истине:

$client = new \SoapClient($wsdlPath, array('trace'=>true));

Затем, после выполнения вашего SOAP-запроса, вы можете сделать это, чтобы увидеть использованные заголовки:

var_dump( $client->__getLastRequestHeaders() );

0 голосов
/ 15 ноября 2010

Почему бы не установить собственные заголовки мыла ? При необходимости расширьте класс по умолчанию и внедрите свою собственную версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...