NeoN, вам нужно заменить ответ с
проблемной кодировкой windows-1251 на другой ответ c
правильной кодировкой utf-8...
async function windows1251ResponseToUTF8Response(response) {
return new Response(new TextDecoder("windows-1251").decode(await response.arrayBuffer()));
}
fetch('https://vk.com/al_im.php', {
credentials: 'include',
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded;charset=utf-8',
'x-requested-with': 'XMLHttpRequest',
'origin': 'https://vk.com'
},
body: '_smt=im%3A2&act=a_dialogs_preload&al=1&gid=0&im_v=2&rs='
}).then(windows1251ResponseToUTF8Response).then(resp=>resp.json()).then(console.log)
Или преобразовать кодировку windows-1251 в utf-8...
function transformWindows1251ToUTF8(response) {
const transformedBody = response.body
.pipeThrough(new TextDecoderStream("windows-1251"))
.pipeThrough(new TextEncoderStream("utf-8"));
return new Response(transformedBody);
}
fetch('https://vk.com/al_im.php', {
credentials: 'include',
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded;charset=utf-8',
'x-requested-with': 'XMLHttpRequest',
'origin': 'https://vk.com'
},
body: '_smt=im%3A2&act=a_dialogs_preload&al=1&gid=0&im_v=2&rs='
}).then(transformWindows1251ToUTF8).then(resp=>resp.json()).then(console.log)
Сообщение от Aetae
|
Никак.
|
ОБМАН!!! Вы сами приводите ниже «правильный подход»!
Сообщение от Aetae
|
Гении из комитета считают что весь интернет должен жить в utf8(небезосновательно, в целом) и таким образом насаждают свой видение.
|
ОБМАН!!! Функция fetch возвращает асинхронно экземпляр класса Response, который вы можете обработать как угодно. Методы text и json у класса Response, которые декодируют ответ, действительно работают только с кодировкой utf-8, поскольку другие кодировки имеют определённые проблемы и их использование сокращается. Однако, например, метод arrayBuffer у класса Response не использует никакую кодировку, и представляет ответ при помощи ArrayBuffer. (Например, картинка или звук или бинарные данные, которые вы сами разбираете, например, преобразование потока в примере выше)
Сообщение от Aetae
|
Потому fetch никто не использует, кроме как в примерчиках и он остаётся бесполезным мёртворожденным стандартом.
|
ОБМАН!!! Fetch API используется в таких проектах —
twitch.tv, imgur, GitHub и пр., а также частично — Instagram (для получения состояния авторизации), AliExpress и пр., а также в Service Worker-ах у YouTube, Google Maps и пр.
Сообщение от Aetae
|
Люди просто используют либы навроде axios.
|
ОБМАН!!! Например, Twitter использует для подгрузки сообщении
jQuery.ajax (потому что им нужна поддержка старых браузеров), а для уведомлении —
fetch (потому что Service Worker и Notification API всё равно в старых браузерах не работает, зачем тогда туда тянуть jQuery или axios).
axios – это обёртка над классом
XMLHttpRequest в браузере и модулем
http в node.js, использующая Promise.
Fetch API в совокупности со Streams API и Service Worker — это мощнейший инструмент для работы с передачей данных по сети, который может быть легко использован другими технологиями, например — Cache API, СSS Paint API и пр.
fetch – это о том как из запроса получить ответ, а не разобранный ответ в виде JSON, если вдруг получилось, что ответ похож на JSON.