• 0
Jonny

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

Вопросы

Всем привет!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 ответов на этот вопрос

  • 0
20 минут назад, krapotkin сказал:

а где в запросе указание на UTF-8 ? 

OK, а в какой из заголовков добавить то, что мы ждём от сервера UTF-8 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

тогда могу только попросить пример URL для воспроизведения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я так и сделал, но ошибка была не месте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В общем, поставил себе Delphi.10.2.3, всё работает без проблем, запросы взлетают, и не падают, ура!

Всем спасибо за помощь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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