Перейти к содержанию
Fire Monkey от А до Я
  • 0

THTTPClient - Ошибка запроса


Jonny

Вопрос

Всем привет!

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

А самое странное то, что в фиддлере этот запрос из программы отмечается как отменённый... Вообще не понимаю, в чём дело, может кто сталкивался?

1.jpg.10fd1a3684b957dd33c619522dae14c9.jpg

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
12 часов назад, krapotkin сказал:

Поменял чуть заголовки, но нет, запрос всё равно отклоняется, и та же ошибка в программе про несоответствие кодировок

1.jpg.25afeae1bdcb49ce05277dfd017cb58b.jpg

 

Пробовал сохранять ответ в байтовый поток - TBytesStream, тоже не работает

Resp:= TBytesStream.Create;
Resp.Seek(0, 0);
http.Get('https://mysite/', Resp);
Memo.Text:= StringOf(Resp.Bytes);

 

Изменено пользователем Jonny
Редактирование кода
Ссылка на комментарий
  • 0

Вот так попробуйте, без 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
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
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

тоже попробовал

в 10.1.0 этот код падает с указанной ошибкой при декодировании кук, конкретно - _csrf

они помню там что-то мутили с заголовками и куками, надо поискать по баг-листам

Ссылка на комментарий
  • 0

Ладно, спасибо за помощь)

Эту часть программы почти уже сделал через WebBrowser...

Тут единственный вариант, видимо, лезть в исходники, и править тот участок, что отвечает за переваривание и усвоение печенек

Ссылка на комментарий
  • 0

Действительно, проверил на XE8 - есть ошибка. И в Berlin тоже она есть. Исправлена только в Tokyo 10.2.3.

Но просто надо поправить исходник, сегодня посмотрю в чем там дело....

Ссылка на комментарий
  • 0
2 часа назад, Евгений Корепов сказал:

А лучше перейдите на Токио - она же теперь вроде бесплатная?

Да, как вариант, попробую

Я итак уже собрал коллекцию, возможно, скачав Токио, мне подарят путёвку на Мальдивы...

112.png.f89d8cf63d49aa00cdfcb37fc9adf0dd.png

Ссылка на комментарий
  • 0
6 часов назад, Jonny сказал:

Да, как вариант, попробую

Я итак уже собрал коллекцию, возможно, скачав Токио, мне подарят путёвку на Мальдивы...

112.png.f89d8cf63d49aa00cdfcb37fc9adf0dd.png

Чот какая-то неполная у вас коллекция)
У меня еще дельфи 1 есть ?

Ссылка на комментарий
  • 0
  • Модераторы

Нужно создать TStringStream с указанием кодировки UTF-8, и response записывать в этот TStringStream

Тогда проблемы не будет, на Берлине и ниже давно этот баг, особенно проявляется под IOS

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...