SoapClient устанавливает пользовательский заголовок HTTP - PullRequest
10 голосов
/ 30 мая 2011

Я работаю над написанием клиентского приложения SOAP на основе PHP, использующего библиотеки SOAP, встроенные в PHP5.Мне нужно отправить HTTP-cookie и дополнительный HTTP-заголовок как часть запроса.В части cookie нет проблем:

Код:

$client = new SoapClient($webServiceURI, array("exceptions" => 0, "trace" => 1, "encoding" => $phpInternalEncoding));
$client->__setCookie($kkey, $vvalue);

Моя проблема - заголовок HTTP.Я надеялся, что там была бы функция с именем

__setHeader

или

__ setHttpHeader

вбиблиотеки SOAP.Но нет такой удачи.

Кто-нибудь еще имел дело с этим?Есть ли обходной путь?Будет ли легче работать с другой библиотекой SOAP?Спасибо.

(я нашел этот вопрос без ответа http://www.phpfreaks.com/forums/index.php?topic=125387.0, Я скопировал его, потому что у меня та же проблема)

Ответы [ 5 ]

14 голосов
/ 14 июля 2011

Попробуйте установить потоковый контекст для мыльного клиента:

$client = new SoapClient($webServiceURI, array(
    "exceptions" => 0, 
    "trace" => 1, 
    "encoding" => $phpInternalEncoding,
    'stream_context' => stream_context_create(array(
        'http' => array(
            'header' => 'SomeCustomHeader: value'
        ),
    )),
));
3 голосов
/ 10 апреля 2013

Я столкнулся с ситуацией, когда мне пришлось предоставить хэш всего текста запроса мыла в заголовке HTTP запроса для целей аутентификации. Я достиг этого путем создания подкласса SoapClient и использования опции stream_context для установки заголовка:

class AuthenticatingSoapClient extends SoapClient {
    private $secretKey = "secretKeyString";
    private $context;

    function __construct($wsdl, $options) {
        // Create the stream_context and add it to the options
        $this->context = stream_context_create();
        $options = array_merge($options, array('stream_context' => $this->context));

        parent::SoapClient($wsdl, $options);
    }

    // Override doRequest to calculate the authentication hash from the $request. 

    function __doRequest($request, $location, $action, $version, $one_way = 0) {
        // Grab all the text from the request.
        $xml = simplexml_load_string($request);
        $innerText = dom_import_simplexml($xml)->textContent;

        // Calculate the authentication hash. 
        $encodedText = utf8_encode($innerText);
        $authHash = base64_encode(hash_hmac("sha256", $encodedText, $this->secretKey, true));

        // Set the HTTP headers.
        stream_context_set_option($this->context, array('http' => array('header' => 'AuthHash: '. $authHash)));

        return (parent::__doRequest($request, $location, $action, $version, $one_way)); 
    }       
}

Может быть, кто-то найдет это полезным.

3 голосов
/ 28 августа 2011

Этот ответ является правильным способом сделать это в PHP 5.3+ SoapClient устанавливает настраиваемый заголовок HTTP

Однако PHP 5.2 не учитывает все значения из контекста потока. Чтобы обойти это, вы можете создать подкласс, который будет обрабатывать его для вас (хакерским способом, но это работает).

class SoapClientBackport extends SoapClient {
  public function __construct($wsdl, $options = array()){
    if($options['stream_context'] && is_resource($options['stream_context'])){
      $stream_context_options = stream_context_get_options($options['stream_context']);
      $user_agent = (isset($stream_context_options['http']['user_agent']) ? $stream_context_options['http']['user_agent'] : "PHP-SOAP/" . PHP_VERSION) . "\r\n";
      if(isset($stream_context_options['http']['header'])){
        if(is_string($stream_context_options['http']['header'])){
          $user_agent .= $stream_context_options['http']['header'] . "\r\n";
        }
        else if(is_array($stream_context_options['http']['header'])){
          $user_agent .= implode("\r\n", $stream_context_options['http']['header']);
        }
      }
      $options['user_agent'] = $user_agent;
    }
    parent::__construct($wsdl, $options);
  }
}
0 голосов
/ 04 января 2017

его легко реализовать в nuSoap:

nusoap.php

добавить в класс nusoap_base :

var additionalHeaders = array();

затем перейти к функции отправить того же класса

и добавьте

foreach ($this->additionalHeaders as $key => $value) {
    $http->setHeader($key, $value);
}

где-то вокруг (как раз перед)

$http->setSOAPAction($soapaction); (line 7596)

теперь вы можете легко установить заголовки:

$soapClient = new nusoap_client('wsdl adress','wsdl');
$soapClient->additionalHeaders = array('key'=>'val','key2'=>'val');
0 голосов
/ 30 мая 2011

Метод SoapClient::__soapCall имеет аргумент $input_headers, который принимает массив SoapHeader s.

Вы также можете использовать SOAP Zend Framework.клиент, предоставляющий удобный метод addSoapInputHeader.

...