SoapClient设置自定义HTTP标头

时间:2011-05-30 17:26:55

标签: php soap soap-client

我正在编写一个基于PHP的SOAP客户端应用程序,该应用程序使用PHP5本机的SOAP库。我需要发送一个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,我把它复制了b / c我也有同样的问题)

5 个答案:

答案 0 :(得分:14)

尝试为soap客户端设置流上下文:

$client = new SoapClient($webServiceURI, array(
    "exceptions" => 0, 
    "trace" => 1, 
    "encoding" => $phpInternalEncoding,
    'stream_context' => stream_context_create(array(
        'http' => array(
            'header' => 'SomeCustomHeader: value'
        ),
    )),
));

答案 1 :(得分:3)

在PHP 5.3+ SoapClient set custom HTTP Header

中,这个答案是正确的方法

但是,PHP 5.2并未考虑流上下文中的所有值。为了解决这个问题,你可以创建一个为你处理它的子类(以一种hacky方式,但它可以工作)。

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);
  }
}

答案 2 :(得分:3)

我遇到了一种情况,我必须在请求的HTTP标头中提供soap请求的所有文本的哈希值以进行身份​​验证。我通过继承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 :(得分:0)

在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');

答案 4 :(得分:-2)

SoapClient::__soapCall方法有一个$input_headers参数,该参数采用SoapHeader个数组。

您还可以使用Zend Framework的SOAP客户端,它提供了addSoapInputHeader便捷方法。