Last active
June 28, 2024 13:57
-
-
Save PlugFox/4c3886456790e74b3da94c69ca7b28cc to your computer and use it in GitHub Desktop.
Flutter http.get и конвертация результата из Windows-1251 в UTF-8 с последующим разбором
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Список символов в кодировке Windows-1251 | |
const List cp1251 = [ | |
'\u0000', | |
'\u0001', | |
'\u0002', | |
'\u0003', | |
'\u0004', | |
'\u0005', | |
'\u0006', | |
'\u0007', | |
'\u0008', | |
'\u0009', | |
'\n', | |
'\u000B', | |
'\u000C', | |
'\r', | |
'\u000E', | |
'\u000F', | |
'\u0010', | |
'\u0011', | |
'\u0012', | |
'\u0013', | |
'\u0014', | |
'\u0015', | |
'\u0016', | |
'\u0017', | |
'\u0018', | |
'\u0019', | |
'\u001A', | |
'\u001B', | |
'\u001C', | |
'\u001D', | |
'\u001E', | |
'\u001F', | |
'\u0020', | |
'\u0021', | |
'\u0022', | |
'\u0023', | |
'\u0024', | |
'\u0025', | |
'\u0026', | |
'\'', | |
'\u0028', | |
'\u0029', | |
'\u002A', | |
'\u002B', | |
'\u002C', | |
'\u002D', | |
'\u002E', | |
'\u002F', | |
'\u0030', | |
'\u0031', | |
'\u0032', | |
'\u0033', | |
'\u0034', | |
'\u0035', | |
'\u0036', | |
'\u0037', | |
'\u0038', | |
'\u0039', | |
'\u003A', | |
'\u003B', | |
'\u003C', | |
'\u003D', | |
'\u003E', | |
'\u003F', | |
'\u0040', | |
'\u0041', | |
'\u0042', | |
'\u0043', | |
'\u0044', | |
'\u0045', | |
'\u0046', | |
'\u0047', | |
'\u0048', | |
'\u0049', | |
'\u004A', | |
'\u004B', | |
'\u004C', | |
'\u004D', | |
'\u004E', | |
'\u004F', | |
'\u0050', | |
'\u0051', | |
'\u0052', | |
'\u0053', | |
'\u0054', | |
'\u0055', | |
'\u0056', | |
'\u0057', | |
'\u0058', | |
'\u0059', | |
'\u005A', | |
'\u005B', | |
'\\', | |
'\u005D', | |
'\u005E', | |
'\u005F', | |
'\u0060', | |
'\u0061', | |
'\u0062', | |
'\u0063', | |
'\u0064', | |
'\u0065', | |
'\u0066', | |
'\u0067', | |
'\u0068', | |
'\u0069', | |
'\u006A', | |
'\u006B', | |
'\u006C', | |
'\u006D', | |
'\u006E', | |
'\u006F', | |
'\u0070', | |
'\u0071', | |
'\u0072', | |
'\u0073', | |
'\u0074', | |
'\u0075', | |
'\u0076', | |
'\u0077', | |
'\u0078', | |
'\u0079', | |
'\u007A', | |
'\u007B', | |
'\u007C', | |
'\u007D', | |
'\u007E', | |
'\u007F', | |
'\u0402', | |
'\u0403', | |
'\u201A', | |
'\u0453', | |
'\u201E', | |
'\u2026', | |
'\u2020', | |
'\u2021', | |
'\u20AC', | |
'\u2030', | |
'\u0409', | |
'\u2039', | |
'\u040A', | |
'\u040C', | |
'\u040B', | |
'\u040F', | |
'\u0452', | |
'\u2018', | |
'\u2019', | |
'\u201C', | |
'\u201D', | |
'\u2022', | |
'\u2013', | |
'\u2014', | |
'\uFFFD', | |
'\u2122', | |
'\u0459', | |
'\u203A', | |
'\u045A', | |
'\u045C', | |
'\u045B', | |
'\u045F', | |
'\u00A0', | |
'\u040E', | |
'\u045E', | |
'\u0408', | |
'\u00A4', | |
'\u0490', | |
'\u00A6', | |
'\u00A7', | |
'\u0401', | |
'\u00A9', | |
'\u0404', | |
'\u00AB', | |
'\u00AC', | |
'\u00AD', | |
'\u00AE', | |
'\u0407', | |
'\u00B0', | |
'\u00B1', | |
'\u0406', | |
'\u0456', | |
'\u0491', | |
'\u00B5', | |
'\u00B6', | |
'\u00B7', | |
'\u0451', | |
'\u2116', | |
'\u0454', | |
'\u00BB', | |
'\u0458', | |
'\u0405', | |
'\u0455', | |
'\u0457', | |
'\u0410', | |
'\u0411', | |
'\u0412', | |
'\u0413', | |
'\u0414', | |
'\u0415', | |
'\u0416', | |
'\u0417', | |
'\u0418', | |
'\u0419', | |
'\u041A', | |
'\u041B', | |
'\u041C', | |
'\u041D', | |
'\u041E', | |
'\u041F', | |
'\u0420', | |
'\u0421', | |
'\u0422', | |
'\u0423', | |
'\u0424', | |
'\u0425', | |
'\u0426', | |
'\u0427', | |
'\u0428', | |
'\u0429', | |
'\u042A', | |
'\u042B', | |
'\u042C', | |
'\u042D', | |
'\u042E', | |
'\u042F', | |
'\u0430', | |
'\u0431', | |
'\u0432', | |
'\u0433', | |
'\u0434', | |
'\u0435', | |
'\u0436', | |
'\u0437', | |
'\u0438', | |
'\u0439', | |
'\u043A', | |
'\u043B', | |
'\u043C', | |
'\u043D', | |
'\u043E', | |
'\u043F', | |
'\u0440', | |
'\u0441', | |
'\u0442', | |
'\u0443', | |
'\u0444', | |
'\u0445', | |
'\u0446', | |
'\u0447', | |
'\u0448', | |
'\u0449', | |
'\u044A', | |
'\u044B', | |
'\u044C', | |
'\u044D', | |
'\u044E', | |
'\u044F' | |
]; | |
// Fetch publications list | |
Future<List<Publication>> publicationsFetch({int pagination = 1}) async { | |
Map<String, String> requestHeaders = { | |
'Cache-Control': 'no-cache', | |
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', | |
'Accept-Encoding': 'gzip, deflate', | |
'Accept-Language': 'ru-RU;q=0.8', | |
'Connection': 'close', | |
'Upgrade-Insecure-Requests': '0', | |
'Content-Type': 'text/html; charset=windows-1251', | |
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Mobile Safari/537.36', | |
}; | |
http.Response response = await http.get('$_baseURI/public/all/?PAGEN_1=$pagination' | |
, headers: requestHeaders); | |
switch(response.statusCode) { | |
case 401: throw "Ошибка авторизации"; | |
break; | |
case 404: throw "Не верный относительный путь запроса, метод не найден или пока не реализован."; | |
break; | |
case 200: | |
break; | |
default: throw "Ошибка загрузки (${response.statusCode})"; | |
break; | |
} | |
body = decodeCp1251(response.body); | |
Document publicationDocument = parse(body); | |
List<Element> publicationElements = publicationDocument.querySelectorAll('div.publication-item'); | |
List<Publication> publicationList = publicationElements.map((Element ele) { | |
return Publication(id: 0, title: ele.querySelector('h2.publication-name>a').text); | |
}).toList(); | |
return publicationList; | |
} | |
// Преобразуем строку в Win-1251 в UTF-8 | |
String _decodeCp1251(String body) { | |
Uint8List bytes = Uint8List.fromList(body.codeUnits); | |
StringBuffer htmlBuffer = new StringBuffer(); | |
for(num i = 0; i < bytes.length; i++){ | |
htmlBuffer.write('${cp1251[bytes[i]]}'); | |
} | |
return htmlBuffer.toString(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Спасибо, пригодилось :D