SoapClient发送HTTP标头:
POST / HTTP/1.1
Accept: */*
Accept-Encoding: deflate, gzip
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 2085
Expect: 100-continue
HTTP/1.1 100 Continue
我想禁用Expect: 100-continue
。我怎么能这样做?
我发现我应该可以通过以下方式设置自定义标头:
class SoapClient extends \SoapClient implements HttpClientInterface
public function __construct($pathToWSDL, array $options, LoggerInterface $logger){
...
$headers = [
'stream_context' => stream_context_create(
[
'http' => [
'header' => 'SomeCustomHeader: value',
],
]
),
];
parent::__construct($pathToWSDL, array_merge($options, $headers));
}
但这不起作用。
如何设置自定义标题并禁用某些标题?
我也没有使用原生的php,而是使用HipHop VM 3.12.1(rel)。
答案 0 :(得分:3)
HTTP context options表示header
选项可以是字符串或字符串数组,并将覆盖其他给定选项。如果要使用包含多个选项的单个字符串,则可以使用回车符和换行符{\r\n
分隔,如第一个stream_context_create
示例所示。
所以施工将是:
'stream_context' => stream_context_create(
[
'http' => [
'header' => "SomeCustomHeader: value\r\n".
"Expect: \r\n",
],
]
),
或者:
'stream_context' => stream_context_create(
[
'http' => [
'header' => [
'SomeCustomHeader: value',
'Expect: ',
],
],
]
),
在你的情况下,很可能原因是你正在使用的HHVM版本 - 这是a bug in HHVM,它似乎不是fixed in 3.15.0所以你可能想尝试升级你的HHVM并再次尝试。
答案 1 :(得分:3)
一般来说,这种方法会有点过分,但是如果您正在尝试处理stream_context_create
周围的HHVM错误,您可以尝试完全覆盖SoapClient::__doRequest
喜欢这个
public function __doRequest($request, $location, $action, $version, $one_way=0)
{
// @note Omitted Expect: 100-continue
$headers = [
'Accept: */*',
'Accept-Encoding: deflate, gzip',
'SOAPAction: ""',
'Content-Type: text/xml; charset=utf-8',
'Content-Length: ' . strlen($request),
'HTTP/1.1 100 Continue',
];
$ch = curl_init($location);
curl_setopt_array(
$ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $request,
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
我使用这种方法implement SOAP with Attachments并且它工作得很好,尽管在标准的PHP解释器下。
答案 2 :(得分:2)
是的,我使用stream_context_create
来设置一些额外的HTTP标头。我不知道删除其中一个,但也许你可以覆盖一个。那么,您是否尝试过设置空的Expect
标题?
$headers = [
'stream_context' => stream_context_create(
[
'http' => [
'header' => 'Expect: ',
],
]
),
];