2014-04-29 21 views
11

Do kiểm tra tường lửa, yêu cầu phải luôn có tiêu đề "UserAgent" và "Accept".PHP SoapClient(): gửi "User-Agent" và "Accept" HTTP Header

Tôi cố gắng này:

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

yêu cầu nhận được bằng xà phòng máy chủ

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

kết quả dự kiến ​​

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

Tại sao "Chấp nhận" đã không được gửi đi? "Tác nhân người dùng" hoạt động!

Trả lời

10

Hàm tạo SoapClient sẽ không đọc tất cả các tùy chọn stream_context khi tạo tiêu đề yêu cầu. Tuy nhiên, bạn có thể đặt tiêu đề tùy ý trong một chuỗi duy nhất trong một tùy chọn header bên http:

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

Đối với thiết lập nhiều hơn một, tách chúng bằng \r\n.

(Như đã đề cập bởi Ian Phillips, các "user_agent" có thể được lắp ở thư mục gốc của stream_context, hoặc bên trong "http" một phần.)

2

Theo the PHP SoapClient manual page, user_agent là tùy chọn cấp cao nhất. Vì vậy, bạn nên sửa đổi ví dụ của mình như vậy:

$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

lẽ bạn có thể sử dụng fsockopen() phương pháp để làm điều đó như thế này

<?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 
?> 

tôi sử dụng phương pháp đó bằng tay để có được dữ liệu SOAP từ máy vân tay của tôi bây giờ thời gian.

+0

tôi đã bỏ phiếu khi câu hỏi yêu cầu rõ ràng về cách sử dụng 'SoapClient' (http://php.net/manual/en/class.soapclient.php) và điều này không cung cấp bất kỳ trợ giúp nào liên quan đến yêu cầu . –

2

Nếu bạn muốn mã của mình linh hoạt hơn, hãy sử dụng tính năng này.

$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

Cảm ơn g.mansour –

Các vấn đề liên quan