如何在php的SoapClient中设置和禁用标题?

时间:2016-11-15 12:25:31

标签: php soap soap-client hhvm

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)。

3 个答案:

答案 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: ',
            ],
        ]
    ),
];