#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); });
Комментариев нет:
Отправить комментарий