c++下连接网络并使用post方法获取数据
由于某种原因,需要在c++下使用网络将内容获取下来,然后将返回的json数据转换成别的类型输出。
首先是需要将网络上的数据使用post的方法将内容取下来。
下面就是C++的代码:
/* * Notes: * This source demonstrates sending HTTP POST request to webserver from C++ * This uses sockets hence can be compiled on Linux, UNIX, Win */ #define LINUX_OS // #define WIN_OS #define _DEBUG_PRINT(X) /* X */ //For commn #include <iostream> #include <string> #include <stdlib.h> #include <assert.h> #ifdef LINUX_OS #include <netdb.h> #endif #ifdef WIN_OS #include <Winsock2.h> #endif #define SEND_RQ(MSG) \ /*cout<<send_str;*/ \ send(sock,MSG,strlen(MSG),0); using namespace std; //<exe> hostname api parameters int request (char* hostname, char* api, char* parameters, string& message){ #ifdef WIN_OS { WSADATA WsaData; WSAStartup (0x0101, &WsaData); } #endif sockaddr_in sin; int sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == -1) { return -100; } sin.sin_family = AF_INET; sin.sin_port = htons( (unsigned short)80); struct hostent * host_addr = gethostbyname(hostname); if(host_addr==NULL) { _DEBUG_PRINT( cout<<"Unable to locate host"<<endl ); return -103; } sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ; _DEBUG_PRINT( cout<<"Port :"<<sin.sin_port<<", Address : "<< sin.sin_addr.s_addr<<endl); if( connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1 ) { _DEBUG_PRINT( cout<<"connect failed"<<endl ) ; return -101; } string send_str; SEND_RQ("POST "); SEND_RQ(api); SEND_RQ(" HTTP/1.0\r\n"); SEND_RQ("Accept: */*\r\n"); SEND_RQ("User-Agent: Mozilla/4.0\r\n"); char content_header[100]; sprintf(content_header,"Content-Length: %d\r\n",strlen(parameters)); SEND_RQ(content_header); SEND_RQ("Accept-Encoding: gzip, deflate\r\n"); SEND_RQ("Host: "); SEND_RQ(hostname); SEND_RQ("\r\n"); SEND_RQ("Content-Type: application/x-www-form-urlencoded\r\n"); SEND_RQ("Connection: Keep-Alive\r\n"); SEND_RQ("\r\n"); //只需要一个空行! SEND_RQ(parameters); _DEBUG_PRINT(cout<<"####HEADER####"<<endl); char c1[1]; int l,line_length; bool loop = true; bool bHeader = false; while(loop) { l = recv(sock, c1, 1, 0); if(l<0) loop = false; if(c1[0]=='\n') { if(line_length == 0) loop = false; line_length = 0; if(message.find("200") != string::npos) bHeader = true; } else if(c1[0]!='\r') line_length++; _DEBUG_PRINT( cout<<c1[0]); message += c1[0]; } message=""; if(bHeader) { _DEBUG_PRINT( cout<<"####BODY####"<<endl) ; char p[1024]; while((l = recv(sock,p,1023,0)) > 0) { _DEBUG_PRINT( cout.write(p,l)) ; p[l] = '\0'; message += p; } cout << message << endl; } else { return -102; } #ifdef WIN_OS WSACleanup( ); #endif return 0; } int main(){ string message=""; request ("blog.shiniv.com", "/api.php?mod=recent", "type=more", message); }
【声明】本文 c++下连接网络并使用post方法获取数据 为柠之漠然原创文章,转载请注明出自
枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/07/cpp-use-post-get-data/ , 转载请保留本声明!