1

Fedex Rate サービスへの SOAP リクエストを実行すると、「HTTP 本文の取得中にエラーが発生しました。Content-Length がありません。接続が閉じられているか、データがチャンクされています」というメッセージが表示されます。

Apache 2.4.4、PHP 5.4.12 を実行しています。このコードは、Apache 2.2.3、PHP 5.3.27 を実行している別のサーバーで動作しています。

ここに私のPHPコードがあります:

require_once('fedex-common.php5');
$path_to_wsdl = __DIR__ . "/RateService_v10.wsdl";
ini_set( "soap.wsdl_cache_enabled", "0" );

$context = stream_context_create(array(
    'http'=>array(
        'protocol_version' => 1.0
    )
));

$client = new SoapClient( $path_to_wsdl, array( 'trace' => 1,  'stream_context'=>$context ) ); 

...

try {
    ...
    $response = $client->getRates( $request );
    ...
} catch ( SoapFault $exception ) {
    echo($client->__getLastRequestHeaders());
    echo($client->__getLastResponseHeaders());
    printFault( $exception, $client );
}

コードを実行すると、catch ブロックに次のヘッダーが表示されます - Request:

POST /web-services/rate HTTP/1.1
Host: ws.fedex.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.4.12
Content-Type: text/xml; charset=utf-8
SOAPAction: "getRates"
Content-Length: 3875

応答:

HTTP/1.1 200 OK
Date: Thu, 31 Oct 2013 19:12:23 GMT
Server: Apache/2.2
x-wily-servlet: Encrypt1 GaMcoOotgOSMyoYj73M4dqm654IQUUy2VYo7kRLnWqp7O1G9YaZThSMVcxtIAA7cQSSESAO/CtqxI1OyaPemJzOZK7N+WNRwu686y5jWfxAuKqFeRiYJ1NPQTJShYPzp7gOpypOE/sg3Ti/CjdT3XaNt6/pEd18+pXDMyIfKrxnz4xWyAOl9y4Rosae418ks0PYNS9GJy2iOfaSXRiWFkA==
X-Powered-By: Servlet/2.5 JSP/2.1
x-wily-info: Clear guid=0FEE460DCC8738E20EC18F87798CDA26
Vary: Accept-Encoding
Keep-Alive: timeout=8, max=1024
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/xml; charset=utf-8

HTTP/1.0 を指定すると、リクエストが HTTP/1.1 で行われることに混乱しています (他の質問に関する推奨事項に従って)。また、応答ヘッダーでは、チャンクされたデータが確実に返され、そのエラーが発生します。高度な REST クライアント (chrome 拡張機能) で自分でリクエストを実行すると、正しく機能しますTransfer-Encoding: chunkedが、問題の原因であると思われるヘッダーも含まれています。

Apache または PHP の構成に何らかの問題があると思われます。

解決策: Apache 2.2.22 および PHP 5.3.13 にダウングレードすると、問題が修正されました。

4

1 に答える 1