2010-11-15 69 views
1

我遇到了麻煩SOAP壓縮工作,閱讀我已經意識到了服務的文檔那是因爲他們已經決定忽略HTTP標準,做自己的後發送的HTTP標頭事情。我可以修改通過SOAP請求

基本上我需要能夠將內容編碼頭設置爲:

Content-Encoding: accept-gzip,accept-deflate 

而不是使用的Accept-Encoding,他們已經決定使用內容的編碼,這是非常討厭,有機會爲零他們改變它。 如果我在SOAP客戶端設置的壓縮選項發送

Content-Encoding: gzip 

然後使SOAP客戶端拋出一個異常說「未知內容編碼」。

所以是有可能改變的是使用默認的PHP SOAP客戶端發送的HTTP請求?

回答

0

爲什麼不是set your own soap headers?如果需要,擴展默認類並實現您自己的版本。

+0

SOAP頭是不一樣的HTTP頭,這種變化需要在實際的HTTP請求,而不是在SOAP請求作出。 – pogo 2010-11-16 09:34:55

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已經意識到了這一點,但在這裏是爲別人小費誰可能沒有意識到這一點:看SOAP請求,因爲它會被髮送通過了PHP的原生SoapClient類外,設置「追蹤」選項設置爲true:

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

然後,在執行您的SOAP請求後,你可以做到這一點,看看中使用的標題:

var_dump($client->__getLastRequestHeaders());

1

馬爺這個幫助別人:

$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

這樣做可以讓我發送頭文件,但是我收到一個錯誤,提示「警告:gzuncompress():data error」,看起來像SOAP客戶端並沒有意識到它正在獲取壓縮數據,即使我傳遞了壓縮選項 – pogo 2015-01-13 14:11:04