2014-04-29 22 views
11

Ze względu na audyt zapory żądania zawsze muszą mieć nagłówek "UserAgent" i "Accept".PHP SoapClient(): wyślij nagłówek HTTP "User-Agent" i "Accept"

Próbowałem to:

$soapclient = new soapclient('http://www.soap.com/soap.php?wsdl', 
    array('stream_context' => stream_context_create(
     array(
      'http'=> array(
       'user_agent' => 'PHP/SOAP', 
       'accept' => 'application/xml') 
      ) 
     ) 
    ) 
); 

wniosku otrzymanym przez mydłem serwerze

GET /soap.php?wsdl HTTP/1.1 
Host: www.soap.com 
User-Agent: PHP/SOAP 
Connection: close 

oczekiwanego rezultatu

GET /soap.php?wsdl HTTP/1.1 
Host: www.soap.com 
Accept application/xml 
User-Agent: PHP/SOAP 
Connection: close 

Dlaczego "Akceptuj" nie została wysłana? "User-Agent" działa!

Odpowiedz

10

Konstruktor SoapClient nie przeczyta wszystkie opcje stream_context podczas generowania nagłówków żądania. Jednakże, można umieścić dowolne nagłówki w jednym ciągiem w opcji header wewnątrz http:

$soapclient = new SoapClient($wsdl, [ 
    'stream_context' => stream_context_create([ 
     'user_agent' => 'PHP/SOAP', 
     'http'=> [ 
      'header' => "Accept: application/xml\r\n 
         X-WHATEVER: something"    
     ] 
    ]) 
]); 

Aby ustawić więcej niż jeden, rozdzielając je \r\n.

(jak wspomniano przez Ian Phillips The „user_agent” może być umieszczony zarówno na korzeniu stream_context lub wewnątrz „http” części).

2

Według the PHP SoapClient manual page, user_agent jest opcją najwyższego poziomu. Więc należy zmodyfikować przykład tak:

$soapclient = new SoapClient('http://www.soap.com/soap.php?wsdl', [ 
    'stream_context' => stream_context_create([ 
     'http' => ['accept' => 'application/xml'], 
    ]), 
    'user_agent' => 'My custom user agent', 
]); 
0

Być może używać fsockopen() sposób to zrobić jak ta

<?php 
$sock = fsockopen('127.0.0.1' /* server */, 80 /* port */, $errno, $errstr, 1); 

$request = "<Hello><Get>1</Get></Hello>"; 
fputs($sock, "POST /iWsService HTTP/1.0\r\n"); 
fputs($sock, "Content-Type: text/xml\r\n"); 
fputs($sock, "Content-Length: ".strlen($request)."\r\n\r\n"); 
fputs($sock, "$request\r\n"); 
$buffer = ''; 
while($response = fgets($request, 1024)){ 
    $buffer .= $response; 
} 
// Then you can parse that result as you want 
?> 

Używam tej metody ręcznie, aby uzyskać dane SOAP z mojego odcisków palców teraz.

+0

i dół wybrany jako kwestia wyraźnie prosi o używaniu 'SoapClient' (http://php.net/manual/en/class.soapclient.php) i ten nie przewiduje żadnej pomocy w odniesieniu do wniosku . –

2

Jeśli chcesz, aby twój kod był bardziej elastyczny, użyj tego.

$client = new SoapClient(
      dirname(__FILE__) . "/wsdl/" . $env . "/ServiceAvailabilityService.wsdl", 
      array(
       'login' => $login, 
       'password' => $password 
      ) 
     ); 
     //Define the SOAP Envelope Headers 
     $headers = array(); 
     $headers[] = new SoapHeader(
      'http://api.com/pws/datatypes/v1', 
      'RequestContext', 
      array(
       'GroupID' => 'xxx', 
       'RequestReference' => 'Rating Example', 
       'UserToken' => $token 
      ) 
     ); 

//Apply the SOAP Header to your client 
$client->__setSoapHeaders($headers); 
+0

Dzięki g.mansour –