Delphi POST Запрос

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sin3v, 13 Jul 2009.

  1. Sin3v

    Sin3v Banned

    Joined:
    16 Jul 2008
    Messages:
    122
    Likes Received:
    96
    Reputations:
    9
    Как отправить post запрос с Delphi?
    пример на PHP:
    PHP:
    <form action="login.php" method="post">
    <
    input name="email" type="text" value="" />
    <
    input name="pass" type="password" value="" />
    <
    input name="submit" type="button" value="Войти" />
    </
    form>
     
    7 people like this.
  2. diznt

    diznt Elder - Старейшина

    Joined:
    31 Jan 2008
    Messages:
    556
    Likes Received:
    164
    Reputations:
    -19
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     PostData:TStringList;
    begin
        PostData.Add('email=ololo@mail.ru');
        PostData.Add('pass=mypass');
        IdHTTP1.Post('http://sait.ru/login.php',PostData);
    end;
    Находу сбацал... Должно работать...
    Ах да на форму компонент idHTTP1 (вкладка indy clients)
     
    1 person likes this.
  3. Sin3v

    Sin3v Banned

    Joined:
    16 Jul 2008
    Messages:
    122
    Likes Received:
    96
    Reputations:
    9
    Спс пашет, вот так)
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     PostData:TStringList;
    begin
        PostData:= TStringList.Create;
        PostData.Add('email=ololo@mail.ru');
        PostData.Add('pass=mypass');
        IdHTTP1.Post('http://sait.ru/login.php',PostData);
    end;
     
    2 people like this.
  4. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    895
    Likes Received:
    616
    Reputations:
    211
    и на сокетах )
    Code:
    uses winsock
    
    const hos = 'google.com';
    
    function POST(URL,PACKET:string):string;
    var
     req{,data} : string;
     buf      : array[0..1500] of char;
     wData    : WSADATA;
     addr     : sockaddr_in;
     sock     : integer;
     error    : integer;
     phe      : PHostEnt;
    begin
     Result := '';
     WSAStartup($0101, wData);
     phe := gethostbyname(PChar(string(host)));
     if phe = nil then begin
        WSACleanup;
        exit;
     end;
     sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if sock = INVALID_SOCKET then begin
        WSACleanup;
        exit;
     end;
     addr.sin_family := AF_INET;
     addr.sin_port   := htons(80);
     addr.sin_addr   := PInAddr(phe.h_addr_list^)^;
     error := connect(sock, addr, sizeof(addr));
     if error = SOCKET_ERROR then begin
        closesocket(sock);
        WSACleanup;
        exit;
     end;
     req := PACKET;
     if Send(Sock,pointer(req)^,length(req),0)=SOCKET_ERROR then exit;
     fillchar(buf,sizeof(buf),0);
     recv(Sock,buf,10000,0);//sizeof(buf
     closesocket(Sock);
     result:=buf;
    end;
    
    function ePOST(URL,_POST:string):string;
    var req:string;
    begin
     req:='POST '+URL+' HTTP/1.1'#13#10+
          'Host: '+host+#13#10+
          'User-Agent: Opera/9.24 (Windows NT 5.1; U; en)'#13#10+
          'Accept: */*;q=0.1'#13#10+
          'Accept-Encoding: gzip,deflate'#13#10+
          'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8'#13#10+
          'Connection: Keep-Alive'#13#10+
          'Referer: http://vkontakte.ru/index.php'#13#10+
          'Content-Length: '+inttostr(length(_POST))+#13#10+
          'Content-Type: application/x-www-form-urlencoded'#13#10#13#10+_POST;
      result:=POST(URL,req);
    end;
    
    ePOST('http://google.com','a=b&c=d&f=g&');
     
    4 people like this.
  5. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    413
    Likes Received:
    153
    Reputations:
    48
    лучше уж на компонентах, а то этот код на сокетах ещё причёсывать и причёсывать.
     
  6. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    1,012
    Likes Received:
    162
    Reputations:
    27
    Нет, на сокетах лучше.
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,174
    Likes Received:
    266
    Reputations:
    82
    надо блин создать отдельную тему сетевое программирование.... задолбали однотипные вопросы по реализации HTTP запросов и работы с сокетами на различных языках....
     
    _________________________
    1 person likes this.
  8. Neo][acK

    Neo][acK New Member

    Joined:
    27 Mar 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    На Wininet
    Code:
    var
    hOpenHandle, hConnectHandle, hResourceHandle: Pointer;
    begin
    szHost:='www.sait.ru';
    szData:=pansichar('email=ololo@mail.ru&pass=mypass&submit=''');
    hOpenHandle:=InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    
    hConnectHandle:=InternetConnect(hOpenHandle, szHost, 80, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', '/login.php', nil, nil, nil,  INTERNET_FLAG_KEEP_CONNECTION, 0);
    HttpSendRequest(hResourceHandle,  'Content-Type: application/x-www-form-urlencoded', 47, szData, lstrlen(szData));
    
    InternetCloseHandle(hResourceHandle);
    InternetCloseHandle(hConnectHandle);
    InternetCloseHandle(hOpenHandle);
    end;
    
     
  9. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    95
    Likes Received:
    25
    Reputations:
    -1
    И нахер?
    Придерживаясь твоего поста задам вопрос, зачем ты в браузере вводишь antichat.ru а не IP адрес античата)

    Сокеты нужны там где они нужы.
     
  10. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    95
    Likes Received:
    25
    Reputations:
    -1

    Ужасный код(

    Научись красиво оформлять...
     
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,174
    Likes Received:
    266
    Reputations:
    82
    2 [n]-c0der. отвечу на твой вопрос по поводу IP.. есть такая тема как виртуальные хосты и обратившись на прямую по ip адресу ты ответа от нужого сайта не получишь.

    второе. ip адреса закрепленные за доменными именами могут менятся
    третье. функция gethostbyname обращается к DNS и возврашает структуру hostent в котором может содержатся не один IP (за доменом может быть закреплено несколько IP адресов) и если не получается соединится ты можешь попробывать другой адрес, что повышает надежность твоей программы...

    эм нащет компонентов или сокетов... это ваще холи вар. но я считаю так, что писать нужно используя то что дает система, а не то что придумал борланд.... борода это комерческий продукт со своими заморотами и наработками... код с компонентами ты сможешь скомпилировать только в бороде, а код с соекетами при желании сможешь перенести на другую ОС или в другую среду программирования.

    З.Ы: В результате использования этих визуальных средст программирования выходят недопрограммисты, которые и понятия не имею как работает их программа, а знают только куда тыкнуть мышечкой....
     
    _________________________
  12. grafer

    grafer Member

    Joined:
    3 Jun 2009
    Messages:
    19
    Likes Received:
    69
    Reputations:
    0
    А как получить ответ после запроса ?
     
    10 people like this.
  13. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    1,001
    Likes Received:
    839
    Reputations:
    402
    а нет ни у кого, случайно, POST и GET на вин-соке через SSL ?;P

    ps. [n]-c0der - хе*ню ты пишешь, причем в очередной, не знаю уже какой раз.
    Возможности соединения через сокеты намного шире, чем соединение через компоненты.
    Если ты пока еще с этим не сталкивался, значит все, что ты пишешь - быдлокод и не более.
    А если бы сталкивался, то не стал бы писать такую хе*ню.
     
  14. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    102
    Likes Received:
    38
    Reputations:
    7

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include <openssl/crypto.h>
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    
    #if defined _WIN32
    #include <winsock.h>
    #define sleep(x) Sleep(x)
    #define close(x) closesocket(x)
    #pragma comment(lib, "ws2_32.lib")
    #else
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <unistd.h>
    #endif
    
    static char *fetch_ssl_url(const char *, const char *, int *);
    
    int main(int argc, char *argv[])
    {
      char *body;
    
      if (argc < 1 && argc > 4) {
        printf("%s <ssl url> <path>\n", argv[0]);
        return 1;
      }
    
      body = fetch_ssl_url(argv[1], argv[2], NULL);
    
      printf("%s\n", body);
    
      return 0;
    }
    
    int hard_fetch_ip = 0;
    
    #define MAX_LEN 1024
    
    static char *fetch_ssl_url(const char *host, const char *url, int *res_len)
    {
      struct hostent *phe;
      struct sockaddr_in sin;
      int s, len, len_respose;
      char *body_send;
      char *body_recv;
      char *body_response;
    
      SSL_METHOD *method;
      SSL_CTX *ctx;
      SSL *ssl;
    
      SSL_library_init();
      OpenSSL_add_all_algorithms();
      SSL_load_error_strings();
      method = SSLv2_client_method();
      ctx = SSL_CTX_new(method);
      ssl = SSL_new(ctx);
    
    #if defined _WIN32
      WSADATA wsaData;
      WSAStartup(0x101, &wsaData);
    #endif
    
      s = socket(AF_INET, SOCK_STREAM, 0);
      if (s == -1) {
        perror("socket");
        return NULL;
      }
    
      if (!hard_fetch_ip) {
        phe = gethostbyname(host);
        if (phe == NULL) {
          perror("gethostbyname");
          return NULL;
        }
        hard_fetch_ip = ((struct in_addr*)phe->h_addr_list[0])->s_addr;
      }
    
      sin.sin_family = AF_INET;
      sin.sin_addr.s_addr = hard_fetch_ip;
      sin.sin_port = htons(443);
    
      if (connect(s, (struct sockaddr*)&sin, sizeof(struct sockaddr_in))) {
        perror("connect");
        return NULL;
      }
    
      SSL_set_fd(ssl, s);
      SSL_connect(ssl);
    
      body_send = (char *)malloc(MAX_LEN);
      body_recv = (char *)malloc(MAX_LEN);
      body_response = (char *)malloc(MAX_LEN);
    
      memset(body_response, 0, MAX_LEN);
      len_respose = 0;
    
      sprintf(body_send,
    	  "GET /%s HTTP/1.1\r\n"
    	  "Host: %s\r\n"
    	  "Connection: close\r\n"
    	  "Accept: */*\r\n\r\n", url, host);
    
      SSL_write(ssl, body_send, strlen(body_send));
    
      int new_len = MAX_LEN;
      char *tmp;
    
      do {
        len = SSL_read(ssl, body_recv, MAX_LEN);
        len_respose += len;
        if (len_respose > new_len) {
          new_len = new_len * 2;
          body_response = (char *) realloc(body_response, new_len );
        }
        memcpy(body_response + (len_respose - len), body_recv, len);
      } while (len);
    
      // remove headers
      tmp = strstr(body_response, "\r\n\r\n");
      len_respose -= (tmp - body_response + 4);
      memcpy(body_response, tmp + 4, len_respose);
    
      free(body_recv);
      free(body_send);
      close(s);
      SSL_free(ssl);
    
      if (res_len) {
        *res_len = len_respose;
      }
      return body_response;
    }

    $ gcc http_ssl.c -Wall -lssl -o http_ssl

    Windows

    $ i586-mingw32msvc-gcc http_ssl.c -Wall -lssl -o http_ssl

    2 bad hash

    Запускать, например, так:

    $./http_ssl gmail.com /


    PS:

    Переделать для POST запросов, думаю не составит труда.
     
  15. Seregakz

    Seregakz New Member

    Joined:
    13 Jun 2009
    Messages:
    32
    Likes Received:
    1
    Reputations:
    0
    Народ возможноли на Дельфи, передать бинарные файлы на сервер через wininet ?
     
  16. narik_

    narik_ Member

    Joined:
    5 Jun 2009
    Messages:
    27
    Likes Received:
    31
    Reputations:
    0
    Подскажите плз. как отправить через компоненту идхттп инди пост запрос чтоб в шапке было например
    (Request-Line):pOST http://google.com HTTP/1.0
    Host:082.145.197.249:8080

    Тоисть чтобі хост был проксей. Я прописываю настройки прокси в компоненту а получаю всеравно тот же хост. ЧТо делать ?
     
Loading...