Каков самый простой способ вызвать Http GET url с помощью Delphi?

Есть веб-службы, которые я хочу вызвать в своем приложении, я могу использовать его с импортом WSDL или просто использовать «HTTP GET» с URL и параметрами, поэтому я предпочитаю позже, потому что это просто.

Я знаю, что могу использовать indy idhttp.get, чтобы выполнить эту работу, но это очень просто, и я не хочу добавлять в приложение сложный код indy.

ОБНОВЛЕНИЕ : извините, если я не был ясен, я подразумевал под «не добавлять сложный код indy», что я не хочу добавлять компоненты indy только для этой простой задачи и предпочитаю более легкий способ для этого.

delphi,http,network-programming,

39

Ответов: 8


24 ов принято

Вы можете использовать API WinINet следующим образом:

uses WinInet;

function GetUrlContent(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024] of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  if Assigned(NetHandle) then 
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then
      { UrlHandle valid? Proceed with download }
    begin
      FillChar(Buffer, SizeOf(Buffer), 0);
      repeat
        Result := Result + Buffer;
        FillChar(Buffer, SizeOf(Buffer), 0);
        InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
      until BytesRead = 0;
      InternetCloseHandle(UrlHandle);
    end
    else
      { UrlHandle is not valid. Raise an exception. }
      raise Exception.CreateFmt('Cannot open URL %s', [Url]);

    InternetCloseHandle(NetHandle);
  end
  else
    { NetHandle is not valid. Raise an exception }
    raise Exception.Create('Unable to initialize Wininet');
end;

источник: http://www.scalabium.com/faq/dct0080.htm

API WinINet использует тот же материал, что и InternetExplorer, поэтому вы также можете бесплатно установить настройки подключения и прокси-сервера, установленные InternetExplorer.


32 ов

Вызов веб-службы RESTful с помощью Indy довольно прямолинейный.

Добавьте IdHTTP в свой раздел uses. Помните, что IdHTTP нуждается в префиксе «HTTP: //» на ваших URL-адресах.

function GetURLAsString(const aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;

12 ов

На самом деле код в принятом ответе не работал для меня. Поэтому я немного изменил его, так что он фактически возвращает String и изящно закрывает все после выполнения. Пример возвращает полученные данные как UTF8String, поэтому он будет хорошо работать для ASCII, а также для страниц UTF8.

uses WinInet;

function GetUrlContent(const Url: string): UTF8String;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1023] of byte;
  BytesRead: dWord;
  StrBuffer: UTF8String;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 2009', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(NetHandle) then
    try
      UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
        try
          repeat
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
            Result := Result + StrBuffer;
          until BytesRead = 0;
        finally
          InternetCloseHandle(UrlHandle);
        end
      else
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
    finally
      InternetCloseHandle(NetHandle);
    end
  else
    raise Exception.Create('Unable to initialize Wininet');
end;

Надеюсь, это поможет кому-то вроде меня, который искал простой код, как получить содержимое страницы в Delphi. Привет, Алдис :)


Если вы можете загрузить файл, вы можете использовать TDownloadURL из модуля ExtActns. Гораздо проще, чем напрямую использовать WinInet.

procedure TMainForm.DownloadFile(URL: string; Dest: string);
var
  dl: TDownloadURL;
begin
  dl := TDownloadURL.Create(self);
  try
    dl.URL := URL;
    dl.FileName := Dest;
    dl.ExecuteTarget(nil); //this downloads the file
  finally
    dl.Free;
  end;
end;

При использовании этого также можно получать уведомления о ходе работы. Просто назначьте обработчик событий событию OnDownloadProgress TDownloadURL.


В новых версиях Delphi его лучше использовать THTTPClientс System.Net.HttpClientблока, поскольку он является стандартным и кросс-платформенным. Простой пример

function GetURL(const AURL: string): string;
var
  HttpClient: THttpClient;
  HttpResponse: IHttpResponse;
begin
  HttpClient := THTTPClient.Create;
  try
    HttpResponse := HttpClient.Get(AURL);
    Result := HttpResponse.ContentAsString();
  finally
    HttpClient.Free;
  end;
end;
Дельфы, HTTP, сеть программирование,
Похожие вопросы