主な問題:
の2番目のパラメーターにInternetConnect
は、サーバー側スクリプトのURL全体ではなく、サーバーの名前のみを含める必要があります。
の3番目のパラメーターはHttpOpenRequest
、POSTデータではなく、スクリプトのファイル名(URL)である必要があります。
実際のPOSTデータは、の4番目のパラメーターである必要がありますHttpSendRequest
。
マイナーな問題
サンプルコード
次のコードを使用してデータをPOSTします。
procedure WebPostData(const UserAgent: string; const Server: string; const Resource: string; const Data: AnsiString); overload;
var
hInet: HINTERNET;
hHTTP: HINTERNET;
hReq: HINTERNET;
const
accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
header: string = 'Content-Type: application/x-www-form-urlencoded';
begin
hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hHTTP := InternetConnect(hInet, PChar(Server), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
try
hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(Resource), nil, nil, @accept, 0, 1);
try
if not HttpSendRequest(hReq, PChar(header), length(header), PChar(Data), length(Data)) then
raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
finally
InternetCloseHandle(hReq);
end;
finally
InternetCloseHandle(hHTTP);
end;
finally
InternetCloseHandle(hInet);
end;
end;
例えば:
WebPostData('My UserAgent', 'www.rejbrand.se', 'mydir/myscript.asp', 'value=5');
OPによる回答に応じて更新
インターネットからデータを読み取るには、InternetReadFile
関数を使用します。次のコードを使用して、インターネットから小さな(1行の)テキストファイルを読み取ります。
function WebGetData(const UserAgent: string; const Server: string; const Resource: string): string;
var
hInet: HINTERNET;
hURL: HINTERNET;
Buffer: array[0..1023] of AnsiChar;
i, BufferLen: cardinal;
begin
result := '';
hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenUrl(hInet, PChar('http://' + Server + Resource), nil, 0, 0, 0);
try
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
if BufferLen = SizeOf(Buffer) then
result := result + AnsiString(Buffer)
else if BufferLen > 0 then
for i := 0 to BufferLen - 1 do
result := result + Buffer[i];
until BufferLen = 0;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hInet);
end;
end;
使用例:
WebGetData('My UserAgent', 'www.rejbrand.se', '/MyDir/update/ver.txt')
したがって、この関数はデータを読み取るだけで、事前のPOSTはありません。ただし、このInternetReadFile
関数は、によって作成されたハンドルでも使用できるHttpOpenRequest
ため、あなたの場合にも機能します。WinInetリファレンスがMSDNであることをご存知ですか?InternetReadFileなど、すべてのWindowsAPI関数が詳細に説明されています。