Показать сообщение отдельно
  #15 (permalink)  
Старый 22.11.2019, 11:09
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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.

Последний раз редактировалось Malleys, 22.11.2019 в 11:35.
Ответить с цитированием