Я пытаюсь получить доступ к удаленной службе REST API с помощью QML. В соответствии с API службы я должен использовать HTTPS-запросы. Я не знаю, как интерпретировать вывод, который я получаю из кода.
методы.js
function makeRequest()
{
var doc = new XMLHttpRequest();
doc.onreadystatechange = function() {
if (doc.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
console.debug("Headers -->");
console.debug(doc.getAllResponseHeaders ());
console.debug("Last modified -->");
console.debug(doc.getResponseHeader ("Last-Modified"));
console.debug("error: " + doc.status);
}
}
doc.open("GET", "https://somedomain.com");
//var user = "username"
//var pass = "password"
doc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
//doc.setRequestHeader( 'Authorization', 'Basic ' + Qt.btoa( user + ':' + pass ) )
//doc.withCredentials = true;
doc.send();
}
выход:
Headers -->
date: Sun, 20 Dec 2020 16:04:25 GMT
server: Apache
cache-control: private
expires: Thu, 01 Jan 1970 01:00:00 CET
www-authenticate: FORM comment = "Use form to authenticate"
content-length: 6529
x-powered-by: PleskLin
connection: close
content-type: text/html;charset=ISO-8859-1
Last modified -->
error: 401
комментирование закомментированных строк не меняет вывод. Пытается ли вывод сказать мне, что я могу пройти аутентификацию только в том случае, если заполню форму входа? Я не нахожу в этом самой логики, потому что апи сервиса сделано для автоматического взаимодействия с устройствами.
Как уже упоминалось, я получаю тот же результат без комментирования этих строк. Возможно ли, что служба настроена неправильно? Возможен вход через браузер и форму, но не базовая авторизация через код.
Используйте некоторые инструменты для проверки соединения, такие как Postman или что-то еще, а затем соответствующим образом исправьте свой код. Ошибка (401) однозначно указывает на то, что проблема в аутентификации. Кстати, сервер должен предоставить метод аутентификации. Прочитайте ответ на этот вопрос.
Легко пропустил, извини @PjToopmuch. Однако то, как вы формулируете вопрос, должно быть наоборот: в настоящее время вы спрашиваете, почему аутентификация не работает, с кодом, который явно даже не обеспечивает ее. Я бы предложил перевернуть его. Неудивительно, что вы не можете аутентифицироваться без какой-либо аутентификации.
Было два недостатка. Сервис задокументировал неверный URL. Это было https://someurl.com/api вместо https://someurl.com/restapi, и служба действительно ожидает пользователя UTF-8: пароль для базовой аутентификации вместо пользователя: пароль в кодировке Base64. . Просто для полноты: Рабочий код:
function makeRequest()
{
var fetch = {};
fetch["some"] = "requestcontent";
var postData = JSON.stringify(fetch);
var doc = new XMLHttpRequest();
doc.onreadystatechange = function() {
if (doc.readyState == doc.DONE) {
console.debug("Headers -->");
console.debug(doc.getAllResponseHeaders ());
console.debug("Last modified -->");
console.debug(doc.getResponseHeader ("Last-Modified"));
console.debug("code: " + doc.status);
var serverResponse = doc.responseText;
var result = JSON.parse(serverResponse);
}
}
doc.open("POST", "https://someurl.com/api");
var user = "username"
var pass = "password"
doc.setRequestHeader('Content-type', 'application/json');
doc.setRequestHeader( 'Authorization', 'Basic ' + user+':'+pass);
doc.withCredentials = true;
doc.send(postData);
}
ну, все, что связано с аутентификацией (Basic) в коде, который вы разместили, прокомментировано. Что вы ожидаете?