Я пытаюсь настроить запрос SOAP в PHP с использованием базовой аутентификации HTTP.По какой-то причине я продолжаю получать HTTP / 1.1 401 Unauthorized error.
Это пример запроса, который я пытаюсь создать:
POST https://url/someurl/soap HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "SomeSoapAction"
User-Agent: SomeUser Client-HttpClient/3.1
Content-Length: 1503
Authorization: Basic dGsomebasicreyteryheyp0ZXN0ZXI=
Host: somehost.com
Thisэто фрагмент моего кода:
ini_set('display_errors',1);
ini_set("soap.wsdl_cache_enabled", "0");
error_reporting(E_ALL);
$wsdl = "urltosomewsdlfile.wsdl";
$url = "somerl";
$username = "username";
$password = "password";
$encodedstuff = base64_encode("{$username}:{$password}");
$client = new SoapClient($wsdl, array('exceptions' => true,'trace' => true,'login' => 'somelogin', 'password' => 'somepw'));
$header = new SoapHeader($url, 'Authorization: Basic', $encodedstuff);
$client->__setSoapHeaders($header);
try {
$result = $client->SomeSoapAction();
} catch (SoapFault $soapFault) {
var_dump($soapFault);
echo "<br />Request :<br />", htmlentities($client->__getLastRequest()), "<br />";
echo "<br />Response :<br />", htmlentities($client->__getLastResponse()), "<br />";
}
Если я извлекаю имя пользователя и пароль из нового раздела SoapClient , он выдает Uncaught SoapFault исключение: [WSDL] SOAP-ОШИБКА: синтаксический анализ WSDL: невозможно загрузить из ...
Если я добавлю закодированную переменную base64 в новый раздел SoapClient вместо имени пользователя / pw, он выдастта же ошибка синтаксического анализа, что и выше: $ client = new SoapClient ($ wsdl, array ('authentication' => "Basic $ encodedstuff", "exception" => true, 'trace' => true,));
Имя пользователя и пароль работают при прямой загрузке URL.
Может кто-нибудь указать мне правильное направление?Спасибо за любую помощь.
Обновление 18.12.18: я пробовал это как предложенный новый метод, но все еще получаю то же сообщение об ошибке 401:
$opts = array( 'http'=>array( 'method'=>"POST", 'header' => "Authorization: Basic " . base64_encode("{$user}:{$pw}") ) );
$context = stream_context_create($opts);
$client = new SoapClient($wsdl, array('stream_context' => $context,'exceptions' => true,'trace' => true,));
$header = new SoapHeader($url, 'Authorization: Basic', $encodedstuff);
$client->__setSoapHeaders($header);
Обновление 15.01.19: У меня все еще проблемы с этим.
Используя SOAPUI, я могу сделать успешный запрос и получить аутентификацию.Я не вижу разницы между запросом SOAPUI и моим собственным запросом PHP.
Я заметил, что заголовок запроса, созданный моим кодом PHP, изменяет URL-адреса конечных точек POST и Host.В первой части POST URL удален домен, а у Host также удален первый раздел URL.
Заголовок запроса SOAPUI (правильно возвращает 200):
POST https://test-example.com/file/SOAP HTTP/1.1
Host: test-example.com
Заголовок запроса PHP (возвращает 401):
POST /file/SOAP HTTP/1.1
Host: example.com
Это, кажется, вызывает проблему какпохоже, я указываю на неверную конечную точку.Кто-нибудь есть какие-либо советы о том, что может быть не так с моим кодом PHP, чтобы нарушить этот запрос?Спасибо.