Конференция "Сети" » Аналог IdHTTP на winapi.
 
  • Deniska © (26.11.11 14:28) [0]
    Доброго времени суток!
    Хочу написать свой аналог 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; //SendData



    Вопрос такой:
    Как сделать, чтобы вместо:
    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?
  • megavoid © (26.11.11 16:46) [1]
    Вместо InternetOpenUrl используй HttpOpenRequest, HttpSendRequest
    http://stackoverflow.com/questions/1823542/how-to-send-a-http-post-request-in-delphi-using-wininet-api
  • Deniska © (26.11.11 16:49) [2]
    Удалось найти решение, возможно кому-то пригодится:

    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; //SendRequest

    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.



    Еще такой вопрос, что можно улучшить в этом коде?
 
Конференция "Сети" » Аналог IdHTTP на winapi.
Есть новые Нет новых   [134435   +19][b:0][p:0.006]