PHP SoapClient(): отправить "User-Agent" и "Accept" HTTP Header
Из-за проверки брандмауэра в запросах всегда должны быть заголовки UserAgent и Accept.
Я пробовал это:
$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')
)
)
)
);
запрос, полученный серверным мылом
GET /soap.php?wsdl HTTP/1.1
Host: www.soap.com
User-Agent: PHP/SOAP
Connection: close
ожидаемый результат
GET /soap.php?wsdl HTTP/1.1
Host: www.soap.com
Accept application/xml
User-Agent: PHP/SOAP
Connection: close
Почему "Принять" не отправлено? "Пользователь-агент" работает!
Ответы
Ответ 1
Конструктор SoapClient не будет считывать все параметры stream_context при создании заголовков запросов. Тем не менее, вы можете разместить произвольные заголовки в одной строке в header
внутри http
:
$soapclient = new SoapClient($wsdl, [
'stream_context' => stream_context_create([
'user_agent' => 'PHP/SOAP',
'http'=> [
'header' => "Accept: application/xml\r\n
X-WHATEVER: something"
]
])
]);
Чтобы установить более одного, отделите их на \r\n
.
(Как упоминалось Ian Phillips, "user_agent" может быть помещен либо в корень stream_context, либо внутри части "http".)
Ответ 2
Согласно странице руководства PHP SoapClient, user_agent
- это вариант верхнего уровня. Поэтому вы должны изменить свой пример следующим образом:
$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',
]);
Ответ 3
Если вы хотите, чтобы ваш код был более гибким, используйте это.
$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);
Ответ 4
Возможно, вы можете использовать метод fsockopen()
для этого
как это
<?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
?>
Я использую этот метод вручную, чтобы получить данные SOAP с моего устройства отпечатка пальца сейчас.