您的位置:首页 > 理论基础 > 计算机网络

c++调用winhttp对象

2015-09-26 16:27 756 查看
Http访问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用向服务器提交数据,程序中使用POST方式,

提交数据并从服务器获取返回值。

为实现Http访问,微软提供了二套API:WinINet, WinHTTP。WinHTTP比WinINet更加安全和健壮,可以这么认为WinHTTP是WinINet的升级版本。

程序中,通过一个宏的设置来决定是使用WinHttp还是WinINet。

#define USE_WINHTTP //Comment this line to user wininet.

下面来说说实现Http访问的流程(两套API都一样的流程):

1, 首先我们打开一个Session获得一个HINTERNET session句柄;

2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;

3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;

4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;

5, 最后依次关闭request,connect,session句柄。



/***********************定义HTTP发送所用方法***********************************/

HINTERNET OpenSession(LPCWSTR userAgent = 0)

{

#ifdef USE_WINHTTP

return WinHttpOpen(userAgent, NULL, NULL, NULL, NULL);;

#else

return InternetOpen(userAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

#endif

}

HINTERNET Connect(HINTERNET hSession, LPCWSTR serverAddr, int portNo)

{

#ifdef USE_WINHTTP

return WinHttpConnect(hSession, serverAddr, (INTERNET_PORT) portNo, 0);

#else

return InternetConnect(hSession, serverAddr, portNo, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);

#endif

}

HINTERNET OpenRequest(HINTERNET hConnect, LPCWSTR verb, LPCWSTR objectName, int scheme)

{

DWORD flags = 0;

#ifdef USE_WINHTTP

if (scheme == INTERNET_SCHEME_HTTPS) {

flags |= WINHTTP_FLAG_SECURE;

}

return WinHttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags);

#else

if (scheme == INTERNET_SCHEME_HTTPS) {

flags |= INTERNET_FLAG_SECURE;

}

return HttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags, 0);

#endif

}

BOOL AddRequestHeaders(HINTERNET hRequest, LPCWSTR header)

{

SIZE_T len = lstrlenW(header);

#ifdef USE_WINHTTP

return WinHttpAddRequestHeaders(hRequest, header, DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);

#else

return HttpAddRequestHeaders(hRequest, header, DWORD(len), HTTP_ADDREQ_FLAG_ADD);

#endif

}

BOOL SendRequest(HINTERNET hRequest, const void* body, DWORD size)

{

#ifdef USE_WINHTTP

return WinHttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size, size, 0);

#else

return HttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size);

#endif

}

BOOL EndRequest(HINTERNET hRequest)

{

#ifdef USE_WINHTTP

return WinHttpReceiveResponse(hRequest, 0);

#else

// if you use HttpSendRequestEx to send request then use HttpEndRequest in here!

return TRUE;

#endif

}

BOOL QueryInfo(HINTERNET hRequest, int queryId, char* szBuf, DWORD* pdwSize)

{

#ifdef USE_WINHTTP

return WinHttpQueryHeaders(hRequest, (DWORD) queryId, 0, szBuf, pdwSize, 0);

#else

return HttpQueryInfo(hRequest, queryId, szBuf, pdwSize, 0);

#endif

}

BOOL ReadData(HINTERNET hRequest, void* buffer, DWORD length, DWORD* cbRead)

{

#ifdef USE_WINHTTP

return WinHttpReadData(hRequest, buffer, length, cbRead);

#else

return InternetReadFile(hRequest, buffer, length, cbRead);

#endif

}

void CloseInternetHandle(HINTERNET hInternet)

{

if (hInternet)

{

#ifdef USE_WINHTTP

WinHttpCloseHandle(hInternet);

#else

InternetCloseHandle(hInternet);

#endif

}

}

/**********************************************************/

///通过Http方式发送短信

string SendSMS_HTTP(const long ececcid,const string & password ,const string & msisdn, const string &smsContent)

{

string rtnStr ="-1";

HINTERNET hSession = 0;

HINTERNET hConnect = 0;

HINTERNET hRequest = 0;

wstring strHeader(L"Content-type: application/x-www-form-urlencoded\r\n");

// Test data

CrackedUrl crackedUrl(L"http://pi.f3.cn/SendSMS.aspx");

string StrPostData = "ececcid=600000&password="+password+"&msisdn="+msisdn+"&smscontent="+smsContent+"&msgtype=5&longcode=";



StrPostData = string_To_UTF8(StrPostData);

// Open session.

hSession = OpenSession(L"HttpPost by lyz_sea@163.com");

if (hSession == NULL) {

cout<<"Error:Open session!\n";

return "-1";

}

// Connect.

hConnect = Connect(hSession, crackedUrl.GetHostName(), crackedUrl.Ge
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: