1. 程式人生 > >c++獲取http返回的json資料

c++獲取http返回的json資料





//標頭檔案
#include "stdafx.h"
#include <iostream>
#include <string>
#include <Winsock2.h>


#include <windows.h>
#include <wininet.h>
#define MAXSIZE 1024
#pragma comment(lib, "Wininet.lib") 


using namespace std;


#pragma warning(disable:4996)
//函式宣告


int gold = 0;
string sGold = "gold";


int login(std::string gameId, std::string token, std::string openId);
int request(char* hostname, char* api, char* parameters);
void urlopen(_TCHAR*);




//方法呼叫


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;


//request("reg.163.com", "http://reg.163.com/CheckUser.jsp", "test");
//request("center.lewoyx.com", 
//"http://center.lewoyx.com/loginCenter?cmd=pay&server=server_ddz&user_id=9833&prop_id=1&gold=5", 
//"test");
//login()

std::string gameId = "a3c09b36931d57a1fb07955dc5d5978b";
std::string token = "785f7d9a2e6ea4db83cae7c5569681fd2ac84c311763711694cb7b5047134f45";
std::string openId = "47ee567f3827d1acf0c962c81db6be3b";
//nRetCode = login(gameId, token, openId);


std::string strTemp = "http://open.lewoyx.com/UserService/getInfo?gameId=";
strTemp += gameId;
strTemp += "&token=";
strTemp += token;
strTemp += "&openId=";
strTemp += openId;


char* pChar;
int len = strTemp.length();
pChar = new char[len + 1];
strcpy(pChar, strTemp.c_str());
urlopen(pChar);


return nRetCode;
}


////////////////////////////////////////////////////////////////////






void urlopen(_TCHAR* url)
{
std::string stTemp;
char chTemp[1000];
ZeroMemory(chTemp, 1000);
HINTERNET hSession = InternetOpen(_T("UrlTest"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
HINTERNET hHttp = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (hHttp != NULL)
{
printf("%s\n\n", url);
BYTE Temp[MAXSIZE];
ULONG Number = 1;
while (Number > 0)
{
InternetReadFile(hHttp, Temp, MAXSIZE - 1, &Number);
Temp[Number] = '\0';
CopyMemory(chTemp, Temp, Number);
printf("%s", Temp);
}

InternetCloseHandle(hHttp);
hHttp = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
stTemp = chTemp;
cout << "=========================" << endl << endl;
cout << stTemp << endl;
}




////////////////////////////////////////////////////////////////////




int login(std::string gameId, std::string token, std::string openId)
{
if ((gameId) == "" || (token) == "" || (openId) == "")
{
return false;
}


std::string strTemp = "http://open.lewoyx.com/UserService/getInfo?gameId=";
strTemp += gameId;
strTemp += "&token=";
strTemp += token;
strTemp += "&openId=";
strTemp += openId;


char* pChar;
int len = strTemp.length();
pChar = new char[len + 1];
strcpy(pChar, strTemp.c_str());


return request("center.lewoyx.com",
pChar,
"test");
}


//函式實現
int request(char* hostname, char* api, char* parameters)
{
WSADATA WsaData;
WSAStartup(0x0101, &WsaData);




//初始化socket
struct hostent* host_addr = gethostbyname(hostname);
if (host_addr == NULL)
{
cout << "Unable to locate host" << endl;
return -103;
}




sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)80);
sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list);




int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
return -100;
}




//建立連線
if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == -1)
{
cout << "connect failed" << endl;
return -101;
}




//初始化傳送資訊
char send_str[2048] = { 0 };




//頭資訊
strcat(send_str, "POST ");
strcat(send_str, api);
strcat(send_str, " HTTP/1.1\r\n");
strcat(send_str, "Host: ");
strcat(send_str, hostname);
strcat(send_str, "\r\n");
strcat(send_str, "Connection: keep-alive\r\n");




char content_header[100];
sprintf(content_header, "Content-Length: %d\r\n", strlen(parameters));




strcat(send_str, content_header);
strcat(send_str, "Cache-Control: max-age=0\r\n");
strcat(send_str, "Origin: http://www.hao123.com\r\n");
strcat(send_str, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/15.0.849.0 Safari/535.1\r\n");
strcat(send_str, "Content-Type: application/x-www-form-urlencoded\r\n");
strcat(send_str, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
strcat(send_str, "Referer: http://www.hao123.com/\r\n");
strcat(send_str, "Accept-Encoding: gzip,deflate,sdch\r\n");
strcat(send_str, "Accept-Language: zh-CN,zh;q=0.8\r\n");




//內容資訊
strcat(send_str, "\r\n");
strcat(send_str, parameters);




if (send(sock, send_str, strlen(send_str), 0) == -1)
{
cout << "send failed" << endl;
return -101;
}




//獲取返回資訊
char recv_str[4096] = { 0 };
if (recv(sock, recv_str, sizeof(recv_str), 0) == -1)
{
cout << "recv failed" << endl;
return -101;
}




cout << recv_str << endl;


//char *temp = (char*)ptr;
string sTemp = recv_str;
string sOutTemp = "";
string::size_type idx = sTemp.find(sGold);
string::size_type xx = sTemp.find_last_of("OK");
string::size_type yy = sTemp.find_first_of("OK");
if (idx != string::npos){
cout << "==================="<<sGold <<"==================="<< endl;
sOutTemp = sTemp.substr(idx+4, 4);
cout <<"==============="<< sOutTemp <<"===================="<< endl;
}




WSACleanup();




return 0;
}