Я пытаюсь реализовать простую xhr абстракцию и получаю это предупреждение при попытке установить заголовки для POST. Я думаю, что это могло бы иметь некоторое отношение к установке заголовков в отдельном js файле, потому что, когда я установил их в <script>
тег в .html файле, это хорошо работало. Запрос THE POST хорошо работает, но я получаю это предупреждение, и любопытно почему. Я получаю это предупреждение для обоих content-length
и connection
заголовки, но только в браузерах WebKit (бета Chrome 5 и Safari 4). В Firefox я не получаю предупреждений, заголовок Довольной Длины установлен на правильное значение, но Соединение установлено на активный вместо завершения, которое заставляет меня думать, что это также игнорирует мои вызовы setRequestHeader и генерирует свой собственный. Я не попробовал этот код в IE. Вот разметка и код:
test.html
:
<!DOCTYPE html>
<html>
<head>
<script src="jsfile.js"></script>
<script>
var request = new Xhr('POST', 'script.php', true, 'data=somedata', function(data) {
console.log(data.text);
});
</script>
</head>
<body>
</body>
</html>
jsfile.js
:
function Xhr(method, url, async, data, callback) {
var x;
if(window.XMLHttpRequest) {
x = new XMLHttpRequest();
x.open(method, url, async);
x.onreadystatechange = function() {
if(x.readyState === 4) {
if(x.status === 200) {
var data = {
text: x.responseText,
xml: x.responseXML
};
callback.call(this, data);
}
}
}
if(method.toLowerCase() === "post") {
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
x.setRequestHeader("Content-Length", data.length);
x.setRequestHeader("Connection", "close");
}
x.send(data);
} else {
// ... implement IE code here ...
}
return x;
}
он также игнорирует мои вызовы setRequestHeader и генерирует свои собственные
Да, стандарт говорит, что он должен:
По соображениям безопасности эти шаги должны быть прекращены, если заголовок [...]
- Connection
- Content-Length
Возникновение с ними может привести к различным запрос контрабанды атак, поэтому браузер всегда использует свои собственные значения. Нет необходимости или причин пытаться установить длину запроса, поскольку браузер может сделать это точно, исходя из длины данных, которые вы передаете в send ()
.