我可以修改通过SOAP请求发送的http标头

时间:2010-11-15 16:25:02

标签: php soap

我无法使SOAP压缩工作,在阅读了服务文档之后我意识到这是因为他们决定忽略HTTP标准并做自己的事情。

基本上我需要能够将内容编码标头设置为:

Content-Encoding: accept-gzip,accept-deflate

他们不是使用Accept-Encoding,而是决定使用令人难以置信的内容编码,而且他们改变它的可能性为零。 如果我在SOAP客户端中设置压缩选项,则发送

Content-Encoding: gzip

然后导致SOAP客户端抛出异常“Unknown Content-Encoding”。

那么可以改变使用默认的php SOAP客户端发送的http请求吗?

3 个答案:

答案 0 :(得分:2)

Maye这对某人有所帮助:

$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 );

答案 1 :(得分:0)

为什么不set your own soap headers?如果需要,扩展默认类并实现自己的版本。

答案 2 :(得分:0)

可以更改所使用的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已经意识到了这一点,但是对于其他可能没有意识到这一点的人来说,这是一个提示:要查看由PHP的本机SoapClient类发出的SOAP请求,请设置'trace'选项为true:

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

然后,在执行SOAP请求后,您可以执行此操作以查看使用的标头:

var_dump( $client->__getLastRequestHeaders() );