Вот процедура для выполнения HTTP-запроса с использованием WinINet и либо возврата извлеченной строки, либо выдачи исключения:
function Request(const pConnection: HINTERNET; const localpath: string): string;
var Buffer: packed Array[1..5000] of Char; BytesRead: Cardinal; pRequest: HINTERNET; sent: boolean;
begin
Result := '';
pRequest := HTTPOpenRequest(pConnection, 'GET', pchar(localpath), nil, nil, nil, 0, 0);
if pRequest <> nil then
begin
sent := HTTPSendRequest(pRequest, nil, 0, nil, 0);
if sent then
while InternetReadFile(pRequest, @Buffer, SizeOf(Buffer)-1 {leave room for terminator}, BytesRead) do
begin
Buffer[BytesRead+1] := #0;
Result := Result + buffer;
end;
InternetCloseHandle(pRequest);
if not sent then RaiseLastOSerror; // HTTPSendRequest failed
end
else RaiseLastOSerror; // HTTPOpenRequest failed
end;
Если InternetCloseHandle (pRequest) может завершиться ошибкой, даже если pRequest был успешно назначен, GetLastError ()вернет код ошибки для InternetCloseHandle () вместо HTTPSendRequest ().Исправление, которое потребовало бы кода вроде:
function Request(const pConnection: HINTERNET; const localpath: string): string;
var Buffer: packed Array[1..5000] of Char; BytesRead: Cardinal; pRequest: HINTERNET;
begin
Result := '';
pRequest := HTTPOpenRequest(pConnection, 'GET', pchar(localpath), nil, nil, nil, 0, 0);
if pRequest <> nil then
begin
if HTTPSendRequest(pRequest, nil, 0, nil, 0) then
while InternetReadFile(pRequest, @Buffer, SizeOf(Buffer)-1 {leave room for terminator}, BytesRead) do
begin
Buffer[BytesRead+1] := #0;
Result := Result + buffer;
end
else
begin
InternetCloseHandle(pRequest);
RaiseLastOSerror; // HTTPSendRequest failed
end;
InternetCloseHandle(pRequest);
end
else RaiseLastOSerror; // HTTPOpenRequest failed
end;
, но на первый взгляд это выглядит намного уродливее и запутаннее.
Можно ли предположить, что InternetCloseHandle () не удастся, что позволитболее простой код?