我无法使SOAP压缩工作,在阅读了服务文档之后我意识到这是因为他们决定忽略HTTP标准并做自己的事情。
基本上我需要能够将内容编码标头设置为:
Content-Encoding: accept-gzip,accept-deflate
他们不是使用Accept-Encoding,而是决定使用令人难以置信的内容编码,而且他们改变它的可能性为零。 如果我在SOAP客户端中设置压缩选项,则发送
Content-Encoding: gzip
然后导致SOAP客户端抛出异常“Unknown Content-Encoding”。
那么可以改变使用默认的php SOAP客户端发送的http请求吗?
答案 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() );