12
votes

SOAPCLIENT SET ENREGRE HTTP personnalisé

Je fais des travaux d'écrire une application client de savon basée sur PHP utilisant les bibliothèques de savon natives à PHP5. J'ai besoin d'envoyer un cookie HTTP et un en-tête HTTP supplémentaire dans le cadre de la demande. La partie cookie n'est pas un problème:

code: xxx

Mon problème est l'en-tête HTTP. J'espérais avoir eu une fonction nommée

__ sethireder

ou

__ Sethttheader

dans les bibliothèques de savon. Mais pas de bonne chance.

Quelqu'un d'autre traitait-il? Y at-il un travail autour? Une bibliothèque de savon différente serait-elle plus facile à travailler? Merci.

(J'ai trouvé cette question Unenswerd ici ici http://www.phpfreaks.com/forums/ Index.php? Topic = 125387.0 , je l'ai copié B / C J'ai le même problème)


0 commentaires

5 Réponses :


-2
votes

the SOAPCLIENT :: __ SOAPCALL La méthode a Un argument INPUT_HEADERS , qui prend un tableau de SOAPHEADER s.

Vous pouvez également utiliser le client SOAP de Zend Framework, qui fournit un AddSoApinPheader Méthode de commodité.


2 commentaires

C'est pour les soaphers, mais j'ai besoin / à la recherche d'un moyen de modifier l'en-tête HTTP de la demande générée par le SOAPCLIENT.


Oh, http en-têtes! Désolé pour ça :) Nusoap prend en charge les cookies, mais vous devez le modifier pour ajouter des en-têtes.



23
votes

Essayez de définir un contexte de flux pour le client SOAP:

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


0 commentaires

4
votes

Cette réponse est la bonne façon de le faire dans PHP 5.3+ Set SoapClient L'en-tête HTTP personnalisé

Toutefois, PHP 5.2 ne prend pas toutes les valeurs du contexte du flux en considération. Pour contourner cela, vous pouvez faire une sous-classe qui le gère pour vous (de manière hacky, mais cela fonctionne). P>

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


1 commentaires

J'ai même dû faire cela avec PHP 5.3.10.



3
votes

J'ai rencontré une situation où j'ai dû fournir un hachage de tout le texte de la demande de savon dans l'en-tête HTTP de la demande d'authentification. J'ai accompli ceci par sous-classement SOAPCLIENT et en utilisant Stream_Context Option Pour définir l'en-tête:

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


0 commentaires

0
votes

Son outil facile à mettre en œuvre dans Nusoap:

nusoap.php strong> p>

Ajouter à la classe nusoap_base strong>: p>

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


0 commentaires