Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Заголовок Content-Length для передачи JSON

#json #javascript


Здравствуйте.
Очень часто в чужом коде и примерах я вижу такой код:
var userData = new UserInfo(login, pass);
            var userData = JSON.stringify(userData);
            request.onreadystatechange = asincComplete;

            request.open("POST", "user_auth.php", true);
            request.setRequestHeader("Content-Type", "text/plain");
            request.setRequestHeader("Content-Length", userData.length);
            request.send(userData);

У меня след. вопрос:
Почему заголовком Content-Length передают длину строки в симовлах (свойство length),
тогда как должна быть указана длина в байтах? Я понимаю, что выше приведенный код справедлив
только для латинских символов, но не для остальных символов юникода.
Каким способом вы кодируете json данные? И каким способом их декодируете на сервере
(например, на php)?
Спасибо.    


Ответы

Ответ 1



... 5.Terminate these steps if header is a case-insensitive match for one of the following headers: Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-Method, Connection, Content-Length, Cookie, Cookie2, Date, DNT, Expect, Host, Keep-Alive, Origin, Referer, TE, Trailer, Transfer-Encoding, Upgrade, User-Agent, Via … or if the start of header is a case-insensitive match for Proxy- or Sec- (including when header is just Proxy- or Sec-). ... отсюда Это означает, что далеко не все заголовки для запроса можно установить, используя XMLHttpRequest. Firefox 23.0 молча отбрасывает такие попытки, Chrome извещает в консоли вот так: Refused to set unsafe header, про остальные браузеры ничего сказать не могу. Конкретно Content-Length в вышеупомянутом списке с 2006 года, так что код либо очень старый, либо некачественный.

Ответ 2



Не нужно выставлять зголов length, это сделает сам браузер: function sendJson(url, jsonData, callback) { var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.onload = function (){ callback(xhr) }; xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(jsonData)); } sendJson('/save/', { "foo": "bar" }, function (xhr){ console.log(xhr); });

Комментариев нет:

Отправить комментарий