Jonny Опубликовано 18 ноября, 2018 Поделиться Опубликовано 18 ноября, 2018 Всем привет! Delphi XE8, отправляю обычный Get-запрос, используя THTTPClient try http:= THTTPClient.Create; with http do begin AllowCookies:= true; Accept:= 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'; AcceptLanguage:= 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,de;q=0.6'; UserAgent:= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.36'; end; Stream:= TStringStream.Create('', TEncoding.UTF8); http.Get('https://mysite.net', Stream); Memo.Text:= Stream.DataString; except on e:exception do Memo.Lines.Add(e.Message); end; В итоге получаю ошибку No mapping for the Unicode character exists in the target multi-byte code page Смотрел в Fiddler'е, страница в UTF-8, Content-Type: text/html; charset=UTF-8 А самое странное то, что в фиддлере этот запрос из программы отмечается как отменённый... Вообще не понимаю, в чём дело, может кто сталкивался? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 18 ноября, 2018 Поделиться Опубликовано 18 ноября, 2018 а где в запросе указание на UTF-8 ? Цитата Ссылка на комментарий
0 Jonny Опубликовано 18 ноября, 2018 Автор Поделиться Опубликовано 18 ноября, 2018 20 минут назад, krapotkin сказал: а где в запросе указание на UTF-8 ? OK, а в какой из заголовков добавить то, что мы ждём от сервера UTF-8 ? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 18 ноября, 2018 Поделиться Опубликовано 18 ноября, 2018 Accept: text/html Accept-Charset: utf-8 https://ru.wikipedia.org/wiki/Список_заголовков_HTTP Цитата Ссылка на комментарий
0 Jonny Опубликовано 19 ноября, 2018 Автор Поделиться Опубликовано 19 ноября, 2018 (изменено) 12 часов назад, krapotkin сказал: Accept: text/html Accept-Charset: utf-8 https://ru.wikipedia.org/wiki/Список_заголовков_HTTP Поменял чуть заголовки, но нет, запрос всё равно отклоняется, и та же ошибка в программе про несоответствие кодировок Пробовал сохранять ответ в байтовый поток - TBytesStream, тоже не работает Resp:= TBytesStream.Create; Resp.Seek(0, 0); http.Get('https://mysite/', Resp); Memo.Text:= StringOf(Resp.Bytes); Изменено 19 ноября, 2018 пользователем Jonny Редактирование кода Цитата Ссылка на комментарий
0 krapotkin Опубликовано 19 ноября, 2018 Поделиться Опубликовано 19 ноября, 2018 тогда могу только попросить пример URL для воспроизведения Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 19 ноября, 2018 Поделиться Опубликовано 19 ноября, 2018 Вот так попробуйте, без stream (это лишняя прокладка). И узнайте точно - в какой кодировке отдает контент ваш сайт. Если это utf-8 то ничего предпринимать не нужно. Var HTTPResponse : IHTTPResponse; begin HTTPResponse:=FHTTPClient.Get(URL); if Assigned(HTTPResponse) then if HTTPResponse.StatusCode=200 then Result:= HTTPResponse.ContentAsString; //наш результат else ErrorMsg:=HTTPResponse.StatusText; Цитата Ссылка на комментарий
0 Jonny Опубликовано 19 ноября, 2018 Автор Поделиться Опубликовано 19 ноября, 2018 41 минуту назад, krapotkin сказал: тогда могу только попросить пример URL для воспроизведения Хорошо, вот url: https://imgvip.net/ Хотел за полчаса написать программу для автопостинга, но что-то пошло не так... 34 минуты назад, Евгений Корепов сказал: Вот так попробуйте, без stream (это лишняя прокладка). И узнайте точно - в какой кодировке отдает контент ваш сайт. Если это utf-8 то ничего предпринимать не нужно. Var HTTPResponse : IHTTPResponse; begin HTTPResponse:=FHTTPClient.Get(URL); if Assigned(HTTPResponse) then if HTTPResponse.StatusCode=200 then Result:= HTTPResponse.ContentAsString; //наш результат else ErrorMsg:=HTTPResponse.StatusText; Изначально я так и делал, через IHTTPResponse, но ошибка та же самая, No mapping for the Unicode character exists in the target multi-byte code page Программа вылетает на строчке с запросом, http.get(url), дальше не идёт Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 19 ноября, 2018 Поделиться Опубликовано 19 ноября, 2018 2 часа назад, Jonny сказал: Хорошо, вот url: https://imgvip.net/ Хотел за полчаса написать программу для автопостинга, но что-то пошло не так... Изначально я так и делал, через IHTTPResponse, но ошибка та же самая, No mapping for the Unicode character exists in the target multi-byte code page Программа вылетает на строчке с запросом, http.get(url), дальше не идёт Все работает без проблем, вот код: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Net.HTTPClient, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } FHTTPClient : THTTPClient; function GetHTTP(const AURL : String; out AContent : String) : boolean; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); Var AContent, AURL : String; begin FHTTPClient:=THTTPClient.Create; if GetHTTP('https://imgvip.net/', AContent) then //Тут работаем с полученным AContent end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FHTTPClient) then FHTTPClient.Free; end; function TForm1.GetHTTP(const AURL : String; out AContent : String) : boolean; Var AHTTPResponse : IHTTPResponse; begin Result:=False; AHTTPResponse:=FHTTPClient.Get(AURL); if Assigned(AHTTPResponse) then begin if AHTTPResponse.StatusCode=200 then AContent:=AHTTPResponse.ContentAsString else raise Exception.Create(AHTTPResponse.StatusText); end else raise Exception.Create('Unknow error'); end; end. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 20 ноября, 2018 Поделиться Опубликовано 20 ноября, 2018 тоже попробовал в 10.1.0 этот код падает с указанной ошибкой при декодировании кук, конкретно - _csrf они помню там что-то мутили с заголовками и куками, надо поискать по баг-листам Jonny 1 Цитата Ссылка на комментарий
0 Jonny Опубликовано 20 ноября, 2018 Автор Поделиться Опубликовано 20 ноября, 2018 Ладно, спасибо за помощь) Эту часть программы почти уже сделал через WebBrowser... Тут единственный вариант, видимо, лезть в исходники, и править тот участок, что отвечает за переваривание и усвоение печенек Цитата Ссылка на комментарий
0 krapotkin Опубликовано 20 ноября, 2018 Поделиться Опубликовано 20 ноября, 2018 да. с печеньками там правда беда ) Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 20 ноября, 2018 Поделиться Опубликовано 20 ноября, 2018 Действительно, проверил на XE8 - есть ошибка. И в Berlin тоже она есть. Исправлена только в Tokyo 10.2.3. Но просто надо поправить исходник, сегодня посмотрю в чем там дело.... Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 20 ноября, 2018 Поделиться Опубликовано 20 ноября, 2018 А лучше перейдите на Токио - она же теперь вроде бесплатная? Цитата Ссылка на комментарий
0 Jonny Опубликовано 20 ноября, 2018 Автор Поделиться Опубликовано 20 ноября, 2018 2 часа назад, Евгений Корепов сказал: А лучше перейдите на Токио - она же теперь вроде бесплатная? Да, как вариант, попробую Я итак уже собрал коллекцию, возможно, скачав Токио, мне подарят путёвку на Мальдивы... Цитата Ссылка на комментарий
0 Barbanel Опубликовано 20 ноября, 2018 Поделиться Опубликовано 20 ноября, 2018 6 часов назад, Jonny сказал: Да, как вариант, попробую Я итак уже собрал коллекцию, возможно, скачав Токио, мне подарят путёвку на Мальдивы... Чот какая-то неполная у вас коллекция) У меня еще дельфи 1 есть Jonny 1 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 22 ноября, 2018 Модераторы Поделиться Опубликовано 22 ноября, 2018 Нужно создать TStringStream с указанием кодировки UTF-8, и response записывать в этот TStringStream Тогда проблемы не будет, на Берлине и ниже давно этот баг, особенно проявляется под IOS Цитата Ссылка на комментарий
0 krapotkin Опубликовано 22 ноября, 2018 Поделиться Опубликовано 22 ноября, 2018 я так и сделал, но ошибка была не месте Цитата Ссылка на комментарий
0 Jonny Опубликовано 22 ноября, 2018 Автор Поделиться Опубликовано 22 ноября, 2018 В общем, поставил себе Delphi.10.2.3, всё работает без проблем, запросы взлетают, и не падают, ура! Всем спасибо за помощь) Евгений Корепов 1 Цитата Ссылка на комментарий
Вопрос
Jonny
Всем привет!
Delphi XE8, отправляю обычный Get-запрос, используя THTTPClient
В итоге получаю ошибку
No mapping for the Unicode character exists in the target multi-byte code page
Смотрел в Fiddler'е, страница в UTF-8, Content-Type: text/html; charset=UTF-8
А самое странное то, что в фиддлере этот запрос из программы отмечается как отменённый... Вообще не понимаю, в чём дело, может кто сталкивался?
Ссылка на комментарий
18 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.