44

アプリケーションで呼び出したい Web サービスがあります。WSDL をインポートして使用するか、URL とパラメーターを指定して "HTTP GET" を使用するだけで使用できます。

仕事をするために indy idhttp.get を使用できることはわかっていますが、これは非常に単純なことであり、アプリケーションに複雑な indy コードを追加したくありません。

更新:わかりにくかったら申し訳ありませんが、「複雑なインディコードを追加しない」という意味でした。この単純なタスクだけにインディコンポーネントを追加したくないので、より軽い方法を好むということです。

4

8 に答える 8

35

Indy を使用して RESTful Web サービスを呼び出すのは非常に簡単です。

uses 句に IdHTTP を追加します。IdHTTP では、URL に「HTTP://」プレフィックスが必要であることに注意してください。

function GetURLAsString(const aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;
于 2008-11-19T11:13:15.890 に答える
27

次のようにWinINet APIを使用できます。

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

WinINet API は、InternetExplorer が使用しているものと同じものを使用するため、InternetExplorer によって設定された接続およびプロキシ設定も無料で取得できます。

于 2008-11-19T11:27:46.873 に答える
17

実際、受け入れられた回答のコードは機能しませんでした。そのため、実際に文字列を返し、実行後にすべてを適切に閉じるように少し変更しました。この例では、取得したデータを UTF8String として返すため、UTF8 ページだけでなく ASCII でもうまく機能します。

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 でページ コンテンツを取得する簡単なコードを探していた私のような人に役立つことを願っています。乾杯、アルディス:)

于 2011-10-13T20:17:29.520 に答える
10

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;
于 2016-12-30T17:44:31.780 に答える
7

ファイルにダウンロードしても問題がない場合は、ExtActnsユニットからTDownloadURLを使用できます。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;

これを使用すると、進行状況の通知を受け取ることもできます。TDownloadURLのOnDownloadProgressイベントにイベントハンドラーを割り当てるだけです。

于 2010-03-20T12:47:03.320 に答える
2

HTTPSEND ユニット ( HTTPGetText、HTTPGetBinary ) でSynapse TCP/IP関数を使用します。HTTP プルを実行し、Winsock 以外の外部 DLL は必要ありません。最新の SVN リリースは、Delphi 2009 で完全に機能します。これはブロッキング関数呼び出しを使用するため、プログラムするイベントはありません。

更新: ユニットは非常に軽量で、コンポーネント ベースではありません。SVN の最新バージョンは、Delphi XE4 でも完全に動作します。

于 2008-11-19T13:44:31.873 に答える
0

アプリケーションが Windows のみの場合は、WinSock を使用することをお勧めします。それは非常に単純で、任意の HTTP 要求を実行でき、同期と非同期の両方で動作できます (コールバックを使用したノンブロッキング WSASend/WSARecv または専用スレッドで古き良き send/recv を使用)。

于 2013-11-15T18:14:03.600 に答える