2011-05-30 28 views
6

Estoy trabajando para escribir una aplicación cliente SOAP basada en PHP que utiliza las bibliotecas SOAP nativas de PHP5. Necesito enviar una cookie HTTP y un encabezado HTTP adicional como parte de la solicitud. La parte cookie es ningún problema:SoapClient set encabezado HTTP personalizado

Código:

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

Mi problema es el encabezado HTTP. Tenía la esperanza no habría sido una función llamada

__setHeader

o

__setHttpHeader

en las bibliotecas de SOAP. Pero no tanta suerte.

¿Alguien más lidió con esto? ¿Hay alguna solución? ¿Sería más fácil trabajar con una biblioteca SOAP diferente? Gracias.

(me encontré con esta pregunta unanswerd aquí http://www.phpfreaks.com/forums/index.php?topic=125387.0, lo copié b/c que he la misma edición)

Respuesta

-2

SoapClient::__soapCall El método tiene un argumento $input_headers, que tiene una serie de SoapHeader s.

También podría utilizar el cliente SOAP de Zend Framework, que proporciona un método de conveniencia addSoapInputHeader.

+1

Eso es para soapheaders pero necesito/la búsqueda de una manera de modificar el encabezado HTTP de la petición que se genera por el SoapClient. – user308891

+0

¡Oh, encabezados HTTP! Perdón por eso :) nuSOAP admite cookies, pero tendrías que modificarlo para agregar encabezados. – igorw

11

Trate de establecer un contexto de secuencia para el cliente de jabón:

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

Esta respuesta es la forma correcta de hacerlo en PHP 5.3+ SoapClient set custom HTTP Header

Sin embargo, PHP 5.2 no toma todos los valores del contexto de la corriente en consideración. Para evitar esto, puede hacer una subclase que lo maneje por usted (de una manera hacky, pero funciona).

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

Incluso tuve que hacer esto con PHP 5.3.10. – leedm777

2

me encontré con una situación en la que tenía que proporcionar un hash de todo el texto de la solicitud de jabón en la cabecera HTTP de la petición para fines de autenticación. He logrado esta subclase SoapClient y usando la opción stream_context para establecer la cabecera:

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

Tal vez alguien la búsqueda se encuentra este útil.

0

su fácil de implementar en NuSOAP:

NuSOAP.PHP

añadir a la clase nusoap_base:

var additionalHeaders = array(); 

entonces la función Goto enviar de la misma clase

y añadir

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

en algún lugar alrededor (justo antes)

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

ahora puede hacerlo fácil establecer cabeceras:

$soapClient = new nusoap_client('wsdl adress','wsdl'); 
$soapClient->additionalHeaders = array('key'=>'val','key2'=>'val'); 
Cuestiones relacionadas