2016-11-15 5 views
2

SoapClient отправляет HTTP-заголовок:Как установить и отключить заголовки в soapClient php?

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

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 который Безразлично Кажется, что tt fixed in 3.15.0, поэтому вы можете попробовать обновить свой HHVM и попробовать снова.

+0

[SoapHeapers] (http://php.net/manual/de/class.soapheader.php) являются частью Soap Envelope (XML в полезной нагрузке HTTP POST). Этот вопрос не о них. Речь идет о заголовках HTTP, которые SoapClient передает по умолчанию и как их адаптировать. – k0pernikus

+0

@ k0pernikus Полностью правильно, удалили это из сообщения и предоставили дополнительную деталь, ссылки и возможное исправление вокруг вашей версии HHVM. – Leith

+0

Кажется, это ошибка HHVM. Откуда вы знаете, что это было зафиксировано в 3.15? Я не вижу ссылку на версию/веху этой фиксации. – k0pernikus

2

Да, я использовал stream_context_create, чтобы установить дополнительный HTTP-заголовок. Я не знаю об удалении одного из них, но, возможно, вы можете перезаписать его. Итак, попробовали ли вы установить пустой заголовок Expect?

$headers = [ 
    'stream_context' => stream_context_create(
     [ 
      'http' => [ 
       'header' => 'Expect: ', 
      ], 
     ] 
    ), 
]; 
+0

Пока нет. Посмотрите на него, чтобы обеспечить обратную связь. – k0pernikus

3

Вообще говоря, этот подход был бы излишним, но если вы пытаетесь справиться с ошибкой HHVM вокруг stream_context_create, вы можете попробовать полностью наиважнейшая 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.