JavaScript - Как установить заголовок запроса для браузера GET
Если мы делаем window.location = "http://MyApi.com/Pdf";
, браузер выполняет GET URL http://MyApi.com/Pdf
. Но если мы хотим установить заголовок authentication
запроса, прежде чем делать GET URL-адреса, потому что сервер является сервером REST и он не поддерживает файлы cookie. Как это сделать?
Во всех случаях я использую $.ajax
для вызова службы, но на этот раз мне нужно показать ответ в новом окне. Ответ - это содержимое файла PDF.
Спасибо заранее.
Ответы
Ответ 1
В более поздних браузерах вы можете использовать blobs:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button onclick="tryit();">PDF</button>
<script>
function tryit() {
var win = window.open('_blank');
downloadFile('/pdf', function(blob) {
var url = URL.createObjectURL(blob);
win.location = url;
});
}
function downloadFile(url, success) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.setRequestHeader("Authorization", "Basic " + btoa("username:password"));
xhr.responseType = "blob";
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (success) success(xhr.response);
}
};
xhr.send(null);
}
</script>
</body>
</html>
В IE спросите пользователя:
window.navigator.msSaveOrOpenBlob(blob, 'readme.pdf');
P.S.
Вы можете протестировать бэкэнд в Node:
router.get('/pdf', function(req, res) {
if(req.headers.authorization !== 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') return res.status(403).send('Not allowed');
res.sendFile(path.join(__dirname, 'public', 'render.pdf'));
});
router.get('/', function(req, res) {
res.render('index');
});
Ответ 2
Если вам не нужно скрывать или обфускировать учетные данные пользователя, просто используйте простое аутентификацию GET:
используйте http://username:[email protected]/
вместо http://MyApi.com/
Ответ 3
Должен ли он быть GET?
Причина, по которой я спрашиваю, заключается в том, что у вас может быть только форма POST (до цели = "_ BLANK" ), которая публикует все, но показывает встроенный файл в новом окне. Конечно, это не решит проблему с вашими настраиваемыми заголовками, но тогда, поскольку вы также можете использовать POST с помощью jquery.ajax - что позволяет вам устанавливать свои собственные заголовки - у вас будет лучшее из обоих миров.
Здесь jQuery plugin, который динамически создает такую форму, чтобы загрузить какой-либо файл. Вы можете использовать это как ссылку...
Надеюсь, что это поможет
Ответ 4
Я думаю, что это то, что вы ищете... Или исправьте меня, если я ошибаюсь.
https://developer.mozilla.org/en/docs/Setting_HTTP_request_headers
Ответ 5
Вы должны настроить $.ajax
с помощью beforeSend
. Ниже пример, но, конечно, я не знаю, будет ли точная настройка работать для вас без какого-либо кода, на который нужно смотреть.
$.ajax( {
url : '/model/user.json',
dataType : 'json',
'beforeSend' : function(xhr) {
var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password);
var base64 = Crypto.util.bytesToBase64(bytes);
xhr.setRequestHeader("Authorization", "Basic " + base64);
},
error : function(xhr, ajaxOptions, thrownError) {
reset();
onError('Invalid username or password. Please try again.');
$('#loginform #user_login').focus();
},
success : function(model) {
cookies();
...
}
});
Для этого вам нужно crypto-js.