Как отправить 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>
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)
Спс пашет, вот так) 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;
и на сокетах ) 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&');
надо блин создать отдельную тему сетевое программирование.... задолбали однотипные вопросы по реализации HTTP запросов и работы с сокетами на различных языках....
На 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;
И нахер? Придерживаясь твоего поста задам вопрос, зачем ты в браузере вводишь antichat.ru а не IP адрес античата) Сокеты нужны там где они нужы.
2 [n]-c0der. отвечу на твой вопрос по поводу IP.. есть такая тема как виртуальные хосты и обратившись на прямую по ip адресу ты ответа от нужого сайта не получишь. второе. ip адреса закрепленные за доменными именами могут менятся третье. функция gethostbyname обращается к DNS и возврашает структуру hostent в котором может содержатся не один IP (за доменом может быть закреплено несколько IP адресов) и если не получается соединится ты можешь попробывать другой адрес, что повышает надежность твоей программы... эм нащет компонентов или сокетов... это ваще холи вар. но я считаю так, что писать нужно используя то что дает система, а не то что придумал борланд.... борода это комерческий продукт со своими заморотами и наработками... код с компонентами ты сможешь скомпилировать только в бороде, а код с соекетами при желании сможешь перенести на другую ОС или в другую среду программирования. З.Ы: В результате использования этих визуальных средст программирования выходят недопрограммисты, которые и понятия не имею как работает их программа, а знают только куда тыкнуть мышечкой....
а нет ни у кого, случайно, POST и GET на вин-соке через SSL ?;P ps. [n]-c0der - хе*ню ты пишешь, причем в очередной, не знаю уже какой раз. Возможности соединения через сокеты намного шире, чем соединение через компоненты. Если ты пока еще с этим не сталкивался, значит все, что ты пишешь - быдлокод и не более. А если бы сталкивался, то не стал бы писать такую хе*ню.
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 запросов, думаю не составит труда.
Подскажите плз. как отправить через компоненту идхттп инди пост запрос чтоб в шапке было например (Request-Line)OST http://google.com HTTP/1.0 Host:082.145.197.249:8080 Тоисть чтобі хост был проксей. Я прописываю настройки прокси в компоненту а получаю всеравно тот же хост. ЧТо делать ?