-
Доброго времени суток! Хочу написать свой аналог IdHTTP, только на винапи. IdHTTP дает возможность отправить Post запрос и получить ответ на него: S := IdHTTP1.Post(' http://***.cgi', Data); Т.е. после выполнения, у меня в переменной S, будет ответ сервера. Запрос, я отправляю так:
procedure SendData(szHost, szPath, szData: PChar);
var
szHeaders: TStr;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
begin
hOpenHandle := InternetOpen(nil, 0, nil, nil, 0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnect(hOpenHandle,
szHost,
80,
nil,
nil,
3,
0,
0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequest(hConnectHandle,
'POST',
szPath,
nil,
nil,
nil,
INTERNET_FLAG_KEEP_CONNECTION,
0);
if hResourceHandle <> nil then
begin
ZeroMemory(@szHeaders, SizeOf(szHeaders));
lstrcpy(szHeaders, 'Content-Type: application/x-www-form-urlencoded');
lstrcat(szHeaders, #10#13#10#13);
HttpSendRequest(hResourceHandle,
szHeaders,
lstrlen(szHeaders),
szData,
lstrlen(szData));
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end;
Вопрос такой: Как сделать, чтобы вместо: procedure SendData(szHost, szPath, szData: PChar); у меня было: function SendData(szHost, szPath, szData: PChar): String; Т.е. чтобы S := IdHTTP1.Post(' http://***.cgi', Data); и S := SendData(' http://***.cgi', Data); давали одинаковый результат. Для IdHTTP1.Get я написал аналог вот так:
function DownloadPage(szUrl: PChar): String;
var
hUrl, hInternet: Pointer;
dwBytes: Dword;
Buf: array [0..4096] of Char;
begin
Result := '';
hInternet := InternetOpen('Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0)',
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if hInternet <> nil then
begin
hUrl := InternetOpenUrl(hInternet,
szUrl,
nil,
0,
INTERNET_FLAG_EXISTING_CONNECT,
0);
if hUrl <> nil then
begin
repeat
ZeroMemory(@Buf, SizeOf(Buf));
InternetReadFile(hUrl, @Buf, 4096, dwBytes);
Result := Result + Buf;
until dwBytes = 0;
end;
InternetCloseHandle(hUrl);
end;
InternetCloseHandle(hInternet);
end;
Memo1.Text := IdHTTP1.Get(Edit1.Text);
Memo2.Text := DownloadPage(PChar(Edit1.Text));
Дают одинаковый результат, как сделать то же с IdHTTP1.Post?
-
-
Удалось найти решение, возможно кому-то пригодится:
function SendRequest(szHost, szPath, lpszVerb, szHeaders, szData: PChar): String;
var
dwBytes: Dword;
Buf: array [0..4096] of Char;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
bRead: Bool;
begin
hOpenHandle := InternetOpen('Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0)',
0,
nil,
nil,
0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnect(hOpenHandle,
szHost,
80,
nil,
nil,
3,
0,
0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequest(hConnectHandle,
lpszVerb,
szPath,
nil,
nil,
nil,
INTERNET_FLAG_KEEP_CONNECTION,
0);
if hResourceHandle <> nil then
begin
if HttpSendRequest(hResourceHandle,
szHeaders,
lstrlen(szHeaders),
szData,
lstrlen(szData)) then
repeat
ZeroMemory(@Buf, SizeOf(Buf));
bRead := InternetReadFile(hResourceHandle, @Buf, 4096, dwBytes);
Result := Result + Buf;
until (bRead = false) or (dwBytes = 0);
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end;
var
szHeaders: TStr;
begin
lstrcpy(szHeaders, 'Content-Type: application/x-www-form-urlencoded');
lstrcat(szHeaders, #10#13#10#13);
Show(PChar(SendRequest('localhost', '/action.php', 'POST', szHeaders, 'Edit1=12345&Button1=Send')));
Show(PChar(SendRequest('localhost', '/forma.php', 'GET', nil, nil)));
end.
Еще такой вопрос, что можно улучшить в этом коде?
|