SoapClient set custom HTTP Header

后端 未结 5 1894
傲寒
傲寒 2020-12-30 06:36

I am doing some work writing a PHP-based SOAP client application that uses the SOAP libraries native to PHP5. I need to send a an HTTP cookie and an additional HTTP header

相关标签:
5条回答
  • 2020-12-30 07:10

    its easy to implement in nuSoap:

    NUSOAP.PHP

    add to class nusoap_base:

    var additionalHeaders = array();
    

    then goto function send of the same class

    and add

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

    somewhere around (just before)

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

    now you can easy set headers:

    $soapClient = new nusoap_client('wsdl adress','wsdl');
    $soapClient->additionalHeaders = array('key'=>'val','key2'=>'val');
    
    0 讨论(0)
  • 2020-12-30 07:21

    This answer is the proper way to do it in PHP 5.3+ SoapClient set custom HTTP Header

    However, PHP 5.2 does not take all of the values from the stream context into consideration. To get around this, you can make a subclass that handles it for you (in a hacky way, but it works).

    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 讨论(0)
  • 2020-12-30 07:21

    I ran into a situation where I had to provide a hash of all the text of the soap request in the HTTP header of the request for authentication purposes. I accomplished this by subclassing SoapClient and using the stream_context option to set the header:

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

    Maybe someone searching will find this useful.

    0 讨论(0)
  • 2020-12-30 07:31

    Try setting a stream context for the soap client:

    $client = new SoapClient($webServiceURI, array(
        "exceptions" => 0, 
        "trace" => 1, 
        "encoding" => $phpInternalEncoding,
        'stream_context' => stream_context_create(array(
            'http' => array(
                'header' => 'SomeCustomHeader: value'
            ),
        )),
    ));
    
    0 讨论(0)
  • 2020-12-30 07:31

    The SoapClient::__soapCall method has an $input_headers argument, which takes an array of SoapHeaders.

    You could also use Zend Framework's SOAP client, which provides an addSoapInputHeader convenience method.

    0 讨论(0)
提交回复
热议问题