アプリケーションで呼び出すWebサービスがあります。WSDLのインポートで使用するか、URLとパラメーターで「HTTP GET」を使用するだけで使用できます。
Indy idhttp.getを使用してジョブを実行できることは知っていますが、これは非常に単純なことであり、アプリケーションに複雑なindyコードを追加したくありません。
[〜#〜] update [〜#〜]:わからない場合は申し訳ありませんが、「複雑なインディコードを追加しない」ことを意味します。単純なタスクであり、そのためのより軽い方法を好む。
次のように 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によって設定された接続とプロキシの設定も無料で取得できます。
Indyを使用してRESTful Webサービスを呼び出すのは非常に簡単です。
IsHTTPをuses句に追加します。 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;
実際、受け入れられた答えのコードは私にとってはうまくいきませんでした。そのため、実際に文字列を返し、実行後にすべてを正常に閉じるように、少し変更しました。例では、取得したデータを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でページコンテンツを取得する簡単なコードを探していた私のような人に役立つことを願っています。乾杯、アルディス:)
新しいDelphiバージョンでは、System.Net.HttpClient
ユニットのTHTTPClient
を使用することをお勧めします。これは、標準でクロスプラットフォームであるためです。簡単な例は
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;
ファイルにダウンロードしても問題ない場合は、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イベントにイベントハンドラーを割り当てるだけです。
Windows HTTP APIの使用も簡単かもしれません。
procedure TForm1.Button1Click(Sender: TObject);
var http: variant;
begin
http:=createoleobject('WinHttp.WinHttpRequest.5.1');
http.open('GET', 'http://lazarus.freepascal.org', false);
http.send;
showmessage(http.responsetext);
end;
上記のコードでは、メインVCLスレッド用にCOMがすでに初期化されていることを意味します。報告によると、単純なアプリやLCLアプリの場合は必ずしもそうとは限りません。また、非同期(マルチスレッド)作業には絶対に当てはまりません。
以下は、実行中の実際のコードのスニペットです。注-機能はボーナスです。働く必要はありません。したがって、リクエストを発行している間、その結果は気にしません。その結果は無視され、ダンプされます。
procedure TfmHaspList.YieldBlinkHTTP(const LED: boolean; const Key_Hardware_ID: cardinal);
var URL: WideString;
begin
URL := 'http://127.0.0.1:1947/action.html?blink' +
IfThen( LED, 'on', 'off') + '=' + IntToStr(Key_Hardware_ID);
TThread.CreateAnonymousThread(
procedure
var Request: OleVariant;
begin
// COM library initialization for the current thread
CoInitialize(nil);
try
// create the WinHttpRequest object instance
Request := CreateOleObject('WinHttp.WinHttpRequest.5.1');
// open HTTP connection with GET method in synchronous mode
Request.Open('GET', URL, False);
// set the User-Agent header value
// Request.SetRequestHeader('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0');
// sends the HTTP request to the server, the Send method does not return
// until WinHTTP completely receives the response (synchronous mode)
Request.Send;
// // store the response into the field for synchronization
// FResponseText := Request.ResponseText;
// // execute the SynchronizeResult method within the main thread context
// Synchronize(SynchronizeResult);
finally
// release the WinHttpRequest object instance
Request := Unassigned;
// uninitialize COM library with all resources
CoUninitialize;
end;
end
).Start;
end;
HTTPSENDユニットで Synapse TCP/IP 関数を使用します( HTTPGetText、HTTPGetBinary )。 HTTPプルを実行し、Winsock以外の外部DLLを必要としません。最新のSVNリリースはDelphi 2009で完全に機能します。これはブロッキング関数呼び出しを使用するため、プログラムするイベントはありません。
更新:ユニットは非常に軽量で、コンポーネントベースではありません。 SVNの最新バージョンは、Delphi XE4でも完全に動作します。
アプリケーションがWindowsのみの場合、WinSockを使用することをお勧めします。簡単で、HTTPリクエストを実行でき、同期と非同期の両方で動作できます(コールバックまたは非推奨のWSASend/WSARecvを使用するか、専用スレッドで古き良きsend/recvを使用します)。