Перейти к содержанию

Вопросы

Так как не получается работать с IdHTTP в сервисе, решил попробовать компонент NetHTTPClient. Бросил NetHTTPClient1 на форму.
Хочу открыть адрес https://ya.ru
В папку \Win32\Debug положил libeay32.dll и ssleay32.dll (они рабочие, проверены с IdHTTP)
 
Код (пока тестирую на обычном приложении, а не в сервисе):

function TFormMain.GetResponse(aURL: string): String;
var 
  Ss: TStringStream; 
begin 
  with NetHTTPClient1 do 
  begin 
    AllowCookies:=true; 
    try 
      Ss:=TStringStream.Create('', TEncoding.UTF8); 
      Get(aURL,ss); 
      Result:=Ss.DataString; 
    finally FreeAndNil(Ss); end; 
  end; 
end;
 
procedure TFormMain.NetHTTPClient1ValidateServerCertificate(
  const Sender: TObject; const ARequest: TURLRequest;
  const [Ref] Certificate: TCertificate; var Accepted: Boolean);
begin
  Accepted:=true;
end;


procedure TFormMain.BtnSendClick(Sender: TObject);
var
  Response:String;
const
  aURL='https://ya.ru';
begin
  TTask.Run(procedure
    begin
    try
      Response:=GetResponse(aURL); // отправляю Get запрос
      TThread.Synchronize(nil, procedure
      begin
        Memo.Lines.Add(Response);
      end);
    finally end;
  end);
end;

Получаю access violation в System.Net.HTTPClient в строке 1965 

if (Result.Value.Chars[0] = '"') and (Result.Value[High(Result.Value)] = '"') then

видимо из-за того что Result.Value пустой. 
А если попробовать открыть https://mail.ru такого не происходит и страница нормально скачивается.
 
В чем проблема?

Отредактировал Rusland

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


Ссылка на сообщение

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

  • 1

Ну тут ошибка разрабов.

  • Копируешь файл  System.Net.HttpClient в папку с проектом (правишь оригинал)
  • Открываешь его на строке с твоей ошибкой(у меня это 1965 строка)
  • Перед ней добавляешь строку:
    if Result.Value.Length>0 then
    

    То есть у тебя получится так(1964-1966 строка):

     Result.Value := Values[0].Substring(Pos + 1).Trim;
      if Result.Value.Length>0 then
      if (Result.Value.Chars[0] = '"') and (Result.Value[High(Result.Value)] = '"') then
    

    Удачи!

Отредактировал Сысоев Максим

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


Ссылка на сообщение
  • 1

По-моему для работы этого компонента не нужно складывать рядом libeay32.dll и ssleay32.dll, всё уже встроено должно быть.

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


Ссылка на сообщение
  • 0

Сысоев Максим, спасибо, проблема с https://ya.ru решилась.

 

Сейчас пытаюсь подключится через NetHTTPClient к локальному серверу с авторизацией (через IdHTTP кстати работает), но тут нарываюсь на ошибку в System.Net.URLClient.pas в строке 859

  if PosScheme = -1 then                                            
    raise ENetURIException.CreateResFmt(@SNetUriInvalid, [AURIStr]);

в какой-то момент AURIStr становиться пустым (уже в DecomposeURI она приходит пустая) и вылезает сообщение 

Project Test.exe raised exception class ENetHTTPClientException with message 'Invalid URL: ""'.

 

Все, решил проблему. Это была моя ошибка с авторизацией.

Вообще крайне мало информации по этому компоненты. Если кто-то решит использовать этот компонент, то прочтите здесь (фактически единственный источник информации).

 

 
 

По-моему для работы этого компонента не нужно складывать рядом libeay32.dll и ssleay32.dll, всё уже встроено должно быть.

 

Вы правы, dll-ки не нужны

 

 

 

 

PS. Кстати, кто-нибудь подскажет как узнать код ответа (200, 404 итп) при использовании NetHTTPClient?

Отредактировал Rusland

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


Ссылка на сообщение
  • 1

PS. Кстати, кто-нибудь подскажет как узнать код ответа (200, 404 итп) при использовании NetHTTPClient?

 

Очень легко.

 

var
    Response: IHTTPResponse;
  begin
     Response := FHTTPClient.Post(CONST_URL, Params, Stream);
     AnswerCode := Response.StatusCode; // вот этот код.

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


Ссылка на сообщение
  • 0

Можно ли как-то задавать timeout для NetHTTPClient?

Если можно, то какой максимальный таймаут на чтение? (не на коннект)

Отредактировал Rusland

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


Ссылка на сообщение
  • 0

Hey Rusland I'm also getting the ENetHTTPClientException with message 'Invalid URL: ""'. error, I do not know how to fix it, how did you fix it?

Отредактировал Tyler Durden

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


Ссылка на сообщение
  • 0

таймауты у них только в берлине запилили

до этого рекомендовали запускать поток, оттуда второй поток с HTTPClient и первый поток прибивает второй, если нет ответа Timeout миллисекунд и выходит сам...

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


Ссылка на сообщение
  • 0
В 14.05.2016 в 21:54, krapotkin сказал:

таймауты у них только в берлине запилили

до этого рекомендовали запускать поток, оттуда второй поток с HTTPClient и первый поток прибивает второй, если нет ответа Timeout миллисекунд и выходит сам...

То-то я заметил ConnectionTimeout и ResponseTimeout и удивлялся что раньше не видел... хм... значит они только появились

Отредактировал Rusland

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


Ссылка на сообщение

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

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

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

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

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

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

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

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


  • Похожий контент

    • От Delpher-X
      У меня есть код, который должен скачивать файл с сайта: 
      var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.  
    • От RADStudioDeveloper
      Привет всем!
      Загрузка с WEB сервера файла с помощью
      NetHTTPClient
      NetHTTPClient1.Get(URL, FS) - загрузка проходит хорошо.
      Вопрос как получить имя загружаемого файла?
      Есть реально работающее решение?
       
       
    • От Mars M
      Есть такой вот код для работы с гугл переводчиком:
      procedure TfrmMain.GTranslate; var Data: TStringList; S: String; begin IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Data := TStringList.Create; try Data.Text := ('client=x'#13#10 + 'text=' + Edit1.Text + #13#10 + 'hl=en'#13#10 + 'sl=en'#13#10 + 'tl=ru'); try S := (IdHTTP1.Post('http://translate.google.ru/translate_a/t', Data)); except on E: exception do ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message); end; finally Data.Free; end; end; Работает без проблем.
      Переделал его для NetHttpClient, практически один в один и вместо перевода получаю html страницу с гугл капчей.
      Типа такой как получаю если заходить через браузер http://translate.google.ru/translate_a/t?client=x&text=Hello&hl=en&sl=en&tl=ru
      Так в чем между ними разница что получаю разный результат?
      PS: Просто я в проекте и так использую NetHttpClient, хотелось бы на нем и сделать а не плодить кучу однотипных компонентов.
    • От long_island
      Всем привет. Встал вопрос после обновления MacOS до High Sierra. Ранее для работы приложения через https из коробки работал Indy в RAD Studio 10.0. После обновления MacOS стала появляться ошибка о невозможности подгрузить библиотеку OpenSSL. Понял, что в обновленной MacOS теперь используется LibreSSL и из коробки теперь не работает. Перерыл тонну материала, но вопрос остался не решенным. Надеюсь, что кто - то имеет какие - то догадки в этом направлении.
    • От bossalex
      Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;
       
    • От Sashar333
      Здравствуйте! Вопрос такой:
      Есть процедура:
      Если переменные inn,capcha и capchaToken указаны правильно то Idhttp работает как надо, если inn или capcha не верны то прим Idhttp.post программа выдает ошибку:

      а хочется получить данные как в анализаторе:

      Как можно это сделать? 
    • От Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • От Кирилл
      Добрый день!
      Возникла необходимость из программы на Android отправлять запросы на web сервер и получать ответ.
      Пробую использовать TidHTTP:
      - кинул на форму компонент TidHTTP;
      - вызываю:  
      procedure TForm1.btSendClick(Sender: TObject); var list: TStringList; s: string; begin list := TStringList.Create; try list.Add('1'); try s := IdHTTP1.Post('http://127.0.0.1', list); ShowMessage(s); except on E: Exception do ShowMessage('Error: ' + E.Message); end; finally FreeAndNil(list); end; end; - в результате программа закрывается. Без всяких сообщений.
      Запускал на смартфоне Samsung Galaxy A3 (2016) Android 6.0.1.
      В чем может быть проблема?
       
       
       
       
       
       
    • От giveaway
      При написании кода под Windows я обычно использую WinNT, чтобы определить, выходит ли пользователь в Интернет через файрвол, а также для проверки сертификата сайта, когда клиент подключается к нему. Чем можно заменить WinNT под Firemonkey, чтобы выполнить эти задачи – проверку наличия файрвола и проверку сертификата сайта? Спасибо.
  • Последние посетители   0 пользователей онлайн

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

×
×
  • Создать...