在向 Fedex Rate 服务发出 SOAP 请求时,我收到“错误获取 http 正文、无内容长度、连接已关闭或分块数据”。
运行 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 块中提供以下标头 - 请求:
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 解决了这个问题