web浏览器网页入口_web浏览器网页入口

web浏览器网页入口_web浏览器网页入口Http访问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用向服务器提交数据,在这个例程中我使用POST方式,提交数据value1与value2,并从服务器得到他们的和(value1+value2

Http访问有两种方式,GETPOST,就编程来说GET方式相对简单点,它不用向服务器提交数据,在这个例程中我使用POST方式,提交数据value1value2,并从服务器得到他们的和(value1 + value2)。

为实现Http访问,微软提供了二APIWinINet, WinHTTPWinHTTPWinINet更加安全和健壮可以这么认为WinHTTPWinINet的升级版本这两套API包含了很多相似的函数与宏定义,呵呵,详细对比请查阅msdn中的文章“Porting WinINet Applications to WinHTTP”,在线MSDN连接:http://msdn2.microsoft.com/en-us/library/aa.aspx。在这个例程中,通过一个宏的设置来决定是使用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, 最后依次关闭requestconnectsession句柄。

 

在这个例程中以上各个流程都进行了简单封装,以便对比两套API函数的些许差异。下面让源代码说话,原工程是一个windows控制台工程,你可以很容易通过拷贝代码重建工程。

 

另:如果你从服务器得到的返回数据是utf8格式的文本数据,你将需要对返回的数据进行转换才能正确显示中文,日文等。仅供参考,转换为ATL CStringW的函数见下:

web浏览器网页入口_web浏览器网页入口
CStringW GetStringWFromUtf8(
const
 std::string
&
 str)
web浏览器网页入口_web浏览器网页入口

{

web浏览器网页入口_web浏览器网页入口    int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), int(str.length()), 0, 0);
web浏览器网页入口_web浏览器网页入口
web浏览器网页入口_web浏览器网页入口    CStringW buf;
web浏览器网页入口_web浏览器网页入口    WCHAR*    dd = buf.GetBuffer(len);
web浏览器网页入口_web浏览器网页入口
web浏览器网页入口_web浏览器网页入口    len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), int(str.length()), dd, len);
web浏览器网页入口_web浏览器网页入口
web浏览器网页入口_web浏览器网页入口    buf.ReleaseBuffer(len);
web浏览器网页入口_web浏览器网页入口
web浏览器网页入口_web浏览器网页入口    return buf;
web浏览器网页入口_web浏览器网页入口}

完整代码如下:

  1
web浏览器网页入口_web浏览器网页入口
//
 HttpPost.cpp written by l_zhaohui@163.com

  2
web浏览器网页入口_web浏览器网页入口
//
 2007/11/30


  3
web浏览器网页入口_web浏览器网页入口
#include 

stdafx.h



  4
web浏览器网页入口_web浏览器网页入口#include 
<
windows.h
>


  5
web浏览器网页入口_web浏览器网页入口#include 
<
stdio.h
>


  6
web浏览器网页入口_web浏览器网页入口#include 
<
stdlib.h
>


  7
web浏览器网页入口_web浏览器网页入口

  8
web浏览器网页入口_web浏览器网页入口#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

  9
web浏览器网页入口_web浏览器网页入口#include 
<
atlbase.h
>


 10
web浏览器网页入口_web浏览器网页入口#include 
<
atlstr.h
>


 11
web浏览器网页入口_web浏览器网页入口

 12
web浏览器网页入口_web浏览器网页入口#define USE_WINHTTP    
//
Comment this line to user wininet.


 13
web浏览器网页入口_web浏览器网页入口
#ifdef USE_WINHTTP

 14
web浏览器网页入口_web浏览器网页入口    #include 
<
winhttp.h
>


 15
web浏览器网页入口_web浏览器网页入口    #pragma comment(lib, 

winhttp.lib

)

 16
web浏览器网页入口_web浏览器网页入口#
else


 17
web浏览器网页入口_web浏览器网页入口    #include 
<
wininet.h
>


 18
web浏览器网页入口_web浏览器网页入口    #pragma comment(lib, 

wininet.lib

)

 19
web浏览器网页入口_web浏览器网页入口#endif

 20
web浏览器网页入口_web浏览器网页入口#define BUF_SIZE    (
1024
)

 21
web浏览器网页入口_web浏览器网页入口

 22
web浏览器网页入口_web浏览器网页入口
//
 CrackedUrl


 23
web浏览器网页入口_web浏览器网页入口
class
 CrackedUrl 
{

 24web浏览器网页入口_web浏览器网页入口    int m_scheme;
 25web浏览器网页入口_web浏览器网页入口    CStringW m_host;
 26web浏览器网页入口_web浏览器网页入口    int m_port;
 27web浏览器网页入口_web浏览器网页入口    CStringW m_path;
 28web浏览器网页入口_web浏览器网页入口public:
 29web浏览器网页入口_web浏览器网页入口    CrackedUrl(LPCWSTR url)
 30web浏览器网页入口_web浏览器网页入口    {

 31web浏览器网页入口_web浏览器网页入口        URL_COMPONENTS uc = { 0};
 32web浏览器网页入口_web浏览器网页入口        uc.dwStructSize = sizeof(uc);
 33web浏览器网页入口_web浏览器网页入口
 34web浏览器网页入口_web浏览器网页入口        const DWORD BUF_LEN = 256;
 35web浏览器网页入口_web浏览器网页入口
 36web浏览器网页入口_web浏览器网页入口        WCHAR host[BUF_LEN];
 37web浏览器网页入口_web浏览器网页入口        uc.lpszHostName = host;
 38web浏览器网页入口_web浏览器网页入口        uc.dwHostNameLength = BUF_LEN;
 39web浏览器网页入口_web浏览器网页入口
 40web浏览器网页入口_web浏览器网页入口        WCHAR path[BUF_LEN];
 41web浏览器网页入口_web浏览器网页入口        uc.lpszUrlPath = path;
 42web浏览器网页入口_web浏览器网页入口        uc.dwUrlPathLength = BUF_LEN;
 43web浏览器网页入口_web浏览器网页入口
 44web浏览器网页入口_web浏览器网页入口        WCHAR extra[BUF_LEN];
 45web浏览器网页入口_web浏览器网页入口        uc.lpszExtraInfo = extra;
 46web浏览器网页入口_web浏览器网页入口        uc.dwExtraInfoLength = BUF_LEN;
 47web浏览器网页入口_web浏览器网页入口
 48web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
 49web浏览器网页入口_web浏览器网页入口        if (!WinHttpCrackUrl(url, 0, ICU_ESCAPE, &uc)) {

 50web浏览器网页入口_web浏览器网页入口            printf(“Error:WinHttpCrackUrl failed!\n”);
 51web浏览器网页入口_web浏览器网页入口        }

 52web浏览器网页入口_web浏览器网页入口
 53web浏览器网页入口_web浏览器网页入口#else
 54web浏览器网页入口_web浏览器网页入口        if (!InternetCrackUrl(url, 0, ICU_ESCAPE, &uc)) {

 55web浏览器网页入口_web浏览器网页入口            printf(“Error:InternetCrackUrl failed!\n”);
 56web浏览器网页入口_web浏览器网页入口        }

 57web浏览器网页入口_web浏览器网页入口#endif
 58web浏览器网页入口_web浏览器网页入口        m_scheme = uc.nScheme;
 59web浏览器网页入口_web浏览器网页入口        m_host = host;
 60web浏览器网页入口_web浏览器网页入口        m_port = uc.nPort;
 61web浏览器网页入口_web浏览器网页入口        m_path = path;
 62web浏览器网页入口_web浏览器网页入口    }

 63web浏览器网页入口_web浏览器网页入口
 64web浏览器网页入口_web浏览器网页入口    int GetScheme() const
 65web浏览器网页入口_web浏览器网页入口    {

 66web浏览器网页入口_web浏览器网页入口        return m_scheme;
 67web浏览器网页入口_web浏览器网页入口    }

 68web浏览器网页入口_web浏览器网页入口
 69web浏览器网页入口_web浏览器网页入口    LPCWSTR GetHostName() const
 70web浏览器网页入口_web浏览器网页入口    {

 71web浏览器网页入口_web浏览器网页入口        return m_host;
 72web浏览器网页入口_web浏览器网页入口    }

 73web浏览器网页入口_web浏览器网页入口
 74web浏览器网页入口_web浏览器网页入口    int GetPort() const
 75web浏览器网页入口_web浏览器网页入口    {

 76web浏览器网页入口_web浏览器网页入口        return m_port;
 77web浏览器网页入口_web浏览器网页入口    }

 78web浏览器网页入口_web浏览器网页入口
 79web浏览器网页入口_web浏览器网页入口    LPCWSTR GetPath() const
 80web浏览器网页入口_web浏览器网页入口    {

 81web浏览器网页入口_web浏览器网页入口        return m_path;
 82web浏览器网页入口_web浏览器网页入口    }

 83web浏览器网页入口_web浏览器网页入口
 84web浏览器网页入口_web浏览器网页入口    static CStringA UrlEncode(const char* p)
 85web浏览器网页入口_web浏览器网页入口    {

 86web浏览器网页入口_web浏览器网页入口        if (p == 0) {

 87web浏览器网页入口_web浏览器网页入口            return CStringA();
 88web浏览器网页入口_web浏览器网页入口        }

 89web浏览器网页入口_web浏览器网页入口
 90web浏览器网页入口_web浏览器网页入口        CStringA buf;
 91web浏览器网页入口_web浏览器网页入口
 92web浏览器网页入口_web浏览器网页入口        for (;;) {

 93web浏览器网页入口_web浏览器网页入口            int ch = (BYTE) (*(p++));
 94web浏览器网页入口_web浏览器网页入口            if (ch == ‘\0’) {

 95web浏览器网页入口_web浏览器网页入口                break;
 96web浏览器网页入口_web浏览器网页入口            }

 97web浏览器网页入口_web浏览器网页入口
 98web浏览器网页入口_web浏览器网页入口            if (isalnum(ch) || ch == ‘_’ || ch == ‘-‘ || ch == ‘.’) {

 99web浏览器网页入口_web浏览器网页入口                buf += (char)ch;
100web浏览器网页入口_web浏览器网页入口            }

101web浏览器网页入口_web浏览器网页入口            else if (ch == ‘ ‘) {

102web浏览器网页入口_web浏览器网页入口                buf += ‘+’;
103web浏览器网页入口_web浏览器网页入口            }

104web浏览器网页入口_web浏览器网页入口            else {

105web浏览器网页入口_web浏览器网页入口                char c[16];
106web浏览器网页入口_web浏览器网页入口                wsprintfA(c, “%%%02X”, ch);
107web浏览器网页入口_web浏览器网页入口                buf += c;
108web浏览器网页入口_web浏览器网页入口            }

109web浏览器网页入口_web浏览器网页入口        }

110web浏览器网页入口_web浏览器网页入口
111web浏览器网页入口_web浏览器网页入口        return buf;
112web浏览器网页入口_web浏览器网页入口    }

113web浏览器网页入口_web浏览器网页入口}

;

114
web浏览器网页入口_web浏览器网页入口

115
web浏览器网页入口_web浏览器网页入口
//
 CrackedUrl


116
web浏览器网页入口_web浏览器网页入口
HINTERNET OpenSession(LPCWSTR userAgent 
=
 
0
)

117
web浏览器网页入口_web浏览器网页入口
{

118web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
119web浏览器网页入口_web浏览器网页入口    return WinHttpOpen(userAgent, NULL, NULL, NULL, NULL);;
120web浏览器网页入口_web浏览器网页入口#else
121web浏览器网页入口_web浏览器网页入口    return InternetOpen(userAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
122web浏览器网页入口_web浏览器网页入口#endif
123web浏览器网页入口_web浏览器网页入口}



124
web浏览器网页入口_web浏览器网页入口

125
web浏览器网页入口_web浏览器网页入口HINTERNET Connect(HINTERNET hSession, LPCWSTR serverAddr, 
int
 portNo)

126
web浏览器网页入口_web浏览器网页入口
{

127web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
128web浏览器网页入口_web浏览器网页入口    return WinHttpConnect(hSession, serverAddr, (INTERNET_PORT) portNo, 0);
129web浏览器网页入口_web浏览器网页入口#else
130web浏览器网页入口_web浏览器网页入口    return InternetConnect(hSession, serverAddr, portNo, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
131web浏览器网页入口_web浏览器网页入口#endif
132web浏览器网页入口_web浏览器网页入口}



133
web浏览器网页入口_web浏览器网页入口

134
web浏览器网页入口_web浏览器网页入口HINTERNET OpenRequest(HINTERNET hConnect, LPCWSTR verb, LPCWSTR objectName, 
int
 scheme)

135
web浏览器网页入口_web浏览器网页入口
{

136web浏览器网页入口_web浏览器网页入口    DWORD flags = 0;
137web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
138web浏览器网页入口_web浏览器网页入口    if (scheme == INTERNET_SCHEME_HTTPS) {

139web浏览器网页入口_web浏览器网页入口        flags |= WINHTTP_FLAG_SECURE;
140web浏览器网页入口_web浏览器网页入口    }

141web浏览器网页入口_web浏览器网页入口
142web浏览器网页入口_web浏览器网页入口    return WinHttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags);
143web浏览器网页入口_web浏览器网页入口
144web浏览器网页入口_web浏览器网页入口#else
145web浏览器网页入口_web浏览器网页入口    if (scheme == INTERNET_SCHEME_HTTPS) {

146web浏览器网页入口_web浏览器网页入口        flags |= INTERNET_FLAG_SECURE;
147web浏览器网页入口_web浏览器网页入口    }

148web浏览器网页入口_web浏览器网页入口
149web浏览器网页入口_web浏览器网页入口    return HttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags, 0);
150web浏览器网页入口_web浏览器网页入口#endif
151web浏览器网页入口_web浏览器网页入口}



152
web浏览器网页入口_web浏览器网页入口

153
web浏览器网页入口_web浏览器网页入口BOOL AddRequestHeaders(HINTERNET hRequest, LPCWSTR header)

154
web浏览器网页入口_web浏览器网页入口
{

155web浏览器网页入口_web浏览器网页入口    SIZE_T len = lstrlenW(header);
156web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
157web浏览器网页入口_web浏览器网页入口    return WinHttpAddRequestHeaders(hRequest, header, DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);
158web浏览器网页入口_web浏览器网页入口#else
159web浏览器网页入口_web浏览器网页入口    return HttpAddRequestHeaders(hRequest, header, DWORD(len), HTTP_ADDREQ_FLAG_ADD);
160web浏览器网页入口_web浏览器网页入口#endif
161web浏览器网页入口_web浏览器网页入口}



162
web浏览器网页入口_web浏览器网页入口

163
web浏览器网页入口_web浏览器网页入口BOOL SendRequest(HINTERNET hRequest, 
const
 
void
*
 body, DWORD size)

164
web浏览器网页入口_web浏览器网页入口
{

165web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
166web浏览器网页入口_web浏览器网页入口    return WinHttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size, size, 0);
167web浏览器网页入口_web浏览器网页入口#else
168web浏览器网页入口_web浏览器网页入口    return HttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size);
169web浏览器网页入口_web浏览器网页入口#endif
170web浏览器网页入口_web浏览器网页入口}



171
web浏览器网页入口_web浏览器网页入口

172
web浏览器网页入口_web浏览器网页入口BOOL EndRequest(HINTERNET hRequest)

173
web浏览器网页入口_web浏览器网页入口
{

174web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
175web浏览器网页入口_web浏览器网页入口    return WinHttpReceiveResponse(hRequest, 0);
176web浏览器网页入口_web浏览器网页入口#else
177web浏览器网页入口_web浏览器网页入口    // if you use HttpSendRequestEx to send request then use HttpEndRequest in here!
178web浏览器网页入口_web浏览器网页入口    return TRUE;
179web浏览器网页入口_web浏览器网页入口#endif
180web浏览器网页入口_web浏览器网页入口}



181
web浏览器网页入口_web浏览器网页入口

182
web浏览器网页入口_web浏览器网页入口BOOL QueryInfo(HINTERNET hRequest, 
int
 queryId, 
char
*
 szBuf, DWORD
*
 pdwSize)

183
web浏览器网页入口_web浏览器网页入口
{

184web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
185web浏览器网页入口_web浏览器网页入口    return WinHttpQueryHeaders(hRequest, (DWORD) queryId, 0, szBuf, pdwSize, 0);
186web浏览器网页入口_web浏览器网页入口#else
187web浏览器网页入口_web浏览器网页入口    return HttpQueryInfo(hRequest, queryId, szBuf, pdwSize, 0);
188web浏览器网页入口_web浏览器网页入口#endif
189web浏览器网页入口_web浏览器网页入口}



190
web浏览器网页入口_web浏览器网页入口

191
web浏览器网页入口_web浏览器网页入口BOOL ReadData(HINTERNET hRequest, 
void
*
 buffer, DWORD length, DWORD
*
 cbRead)

192
web浏览器网页入口_web浏览器网页入口
{

193web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
194web浏览器网页入口_web浏览器网页入口    return WinHttpReadData(hRequest, buffer, length, cbRead);
195web浏览器网页入口_web浏览器网页入口#else
196web浏览器网页入口_web浏览器网页入口    return InternetReadFile(hRequest, buffer, length, cbRead);
197web浏览器网页入口_web浏览器网页入口#endif
198web浏览器网页入口_web浏览器网页入口}



199
web浏览器网页入口_web浏览器网页入口

200
web浏览器网页入口_web浏览器网页入口
void
 CloseInternetHandle(HINTERNET hInternet)

201
web浏览器网页入口_web浏览器网页入口
{

202web浏览器网页入口_web浏览器网页入口    if (hInternet)
203web浏览器网页入口_web浏览器网页入口    {

204web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
205web浏览器网页入口_web浏览器网页入口        WinHttpCloseHandle(hInternet);
206web浏览器网页入口_web浏览器网页入口#else
207web浏览器网页入口_web浏览器网页入口        InternetCloseHandle(hInternet);
208web浏览器网页入口_web浏览器网页入口#endif
209web浏览器网页入口_web浏览器网页入口    }

210web浏览器网页入口_web浏览器网页入口}



211
web浏览器网页入口_web浏览器网页入口

212
web浏览器网页入口_web浏览器网页入口
int
 _tmain(
int
 argc, _TCHAR
*
 argv[])

213
web浏览器网页入口_web浏览器网页入口
{

214web浏览器网页入口_web浏览器网页入口    HINTERNET hSession = 0;
215web浏览器网页入口_web浏览器网页入口    HINTERNET hConnect = 0;
216web浏览器网页入口_web浏览器网页入口    HINTERNET hRequest = 0;
217web浏览器网页入口_web浏览器网页入口    CStringW strHeader(L”Content-type: application/x-www-form-urlencoded\r\n”);
218web浏览器网页入口_web浏览器网页入口
219web浏览器网页入口_web浏览器网页入口    // Test data
220web浏览器网页入口_web浏览器网页入口    CrackedUrl crackedUrl(L”http://www.easy-creator.net/test2/add.asp”);
221web浏览器网页入口_web浏览器网页入口    CStringA strPostData(“value1=10&value2=14”);
222web浏览器网页入口_web浏览器网页入口
223web浏览器网页入口_web浏览器网页入口    // Open session.
224web浏览器网页入口_web浏览器网页入口    hSession = OpenSession(L”HttpPost by l_zhaohui@163.com”);
225web浏览器网页入口_web浏览器网页入口    if (hSession == NULL) {

226web浏览器网页入口_web浏览器网页入口        printf(“Error:Open session!\n”);
227web浏览器网页入口_web浏览器网页入口        return -1;
228web浏览器网页入口_web浏览器网页入口    }

229web浏览器网页入口_web浏览器网页入口
230web浏览器网页入口_web浏览器网页入口    // Connect.
231web浏览器网页入口_web浏览器网页入口    hConnect = Connect(hSession, crackedUrl.GetHostName(), crackedUrl.GetPort());
232web浏览器网页入口_web浏览器网页入口    if (hConnect == NULL) {

233web浏览器网页入口_web浏览器网页入口        printf(“Error:Connect failed!\n”);
234web浏览器网页入口_web浏览器网页入口        return -1;
235web浏览器网页入口_web浏览器网页入口    }

236web浏览器网页入口_web浏览器网页入口
237web浏览器网页入口_web浏览器网页入口    // Open request.
238web浏览器网页入口_web浏览器网页入口    hRequest = OpenRequest(hConnect, L”POST”, crackedUrl.GetPath(), crackedUrl.GetScheme());
239web浏览器网页入口_web浏览器网页入口    if (hRequest == NULL) {

240web浏览器网页入口_web浏览器网页入口        printf(“Error:OpenRequest failed!\n”);
241web浏览器网页入口_web浏览器网页入口        return -1;
242web浏览器网页入口_web浏览器网页入口    }

243web浏览器网页入口_web浏览器网页入口
244web浏览器网页入口_web浏览器网页入口    // Add request header.
245web浏览器网页入口_web浏览器网页入口    if (!AddRequestHeaders(hRequest, strHeader)) {

246web浏览器网页入口_web浏览器网页入口        printf(“Error:AddRequestHeaders failed!\n”);
247web浏览器网页入口_web浏览器网页入口        return -1;
248web浏览器网页入口_web浏览器网页入口    }

249web浏览器网页入口_web浏览器网页入口
250web浏览器网页入口_web浏览器网页入口    // Send post data.
251web浏览器网页入口_web浏览器网页入口    if (!SendRequest(hRequest, (const char*)strPostData, strPostData.GetLength())) {

252web浏览器网页入口_web浏览器网页入口        printf(“Error:SendRequest failed!\n”);
253web浏览器网页入口_web浏览器网页入口        return -1;
254web浏览器网页入口_web浏览器网页入口    }

255web浏览器网页入口_web浏览器网页入口
256web浏览器网页入口_web浏览器网页入口    // End request
257web浏览器网页入口_web浏览器网页入口    if (!EndRequest(hRequest)) {

258web浏览器网页入口_web浏览器网页入口        printf(“Error:EndRequest failed!\n”);
259web浏览器网页入口_web浏览器网页入口        return -1;
260web浏览器网页入口_web浏览器网页入口    }

261web浏览器网页入口_web浏览器网页入口
262web浏览器网页入口_web浏览器网页入口    char szBuf[BUF_SIZE];
263web浏览器网页入口_web浏览器网页入口    DWORD dwSize = 0;
264web浏览器网页入口_web浏览器网页入口    szBuf[0] = 0;
265web浏览器网页入口_web浏览器网页入口
266web浏览器网页入口_web浏览器网页入口    // Query header info.
267web浏览器网页入口_web浏览器网页入口#ifdef USE_WINHTTP
268web浏览器网页入口_web浏览器网页入口    int contextLengthId = WINHTTP_QUERY_CONTENT_LENGTH;
269web浏览器网页入口_web浏览器网页入口    int statusCodeId = WINHTTP_QUERY_STATUS_CODE;
270web浏览器网页入口_web浏览器网页入口    int statusTextId = WINHTTP_QUERY_STATUS_TEXT;
271web浏览器网页入口_web浏览器网页入口#else
272web浏览器网页入口_web浏览器网页入口    int contextLengthId = HTTP_QUERY_CONTENT_LENGTH;
273web浏览器网页入口_web浏览器网页入口    int statusCodeId = HTTP_QUERY_STATUS_CODE;
274web浏览器网页入口_web浏览器网页入口    int statusTextId = HTTP_QUERY_STATUS_TEXT;
275web浏览器网页入口_web浏览器网页入口#endif
276web浏览器网页入口_web浏览器网页入口    dwSize = BUF_SIZE;
277web浏览器网页入口_web浏览器网页入口    if (QueryInfo(hRequest, contextLengthId, szBuf, &dwSize)) {

278web浏览器网页入口_web浏览器网页入口        szBuf[dwSize] = 0;
279web浏览器网页入口_web浏览器网页入口        printf(“Content length:[%s]\n”, szBuf);
280web浏览器网页入口_web浏览器网页入口    }

281web浏览器网页入口_web浏览器网页入口
282web浏览器网页入口_web浏览器网页入口    dwSize = BUF_SIZE;
283web浏览器网页入口_web浏览器网页入口    if (QueryInfo(hRequest, statusCodeId, szBuf, &dwSize)) {

284web浏览器网页入口_web浏览器网页入口        szBuf[dwSize] = 0;
285web浏览器网页入口_web浏览器网页入口        printf(“Status code:[%s]\n”, szBuf);
286web浏览器网页入口_web浏览器网页入口    }

287web浏览器网页入口_web浏览器网页入口
288web浏览器网页入口_web浏览器网页入口    dwSize = BUF_SIZE;
289web浏览器网页入口_web浏览器网页入口    if (QueryInfo(hRequest, statusTextId, szBuf, &dwSize)) {

290web浏览器网页入口_web浏览器网页入口        szBuf[dwSize] = 0;
291web浏览器网页入口_web浏览器网页入口        printf(“Status text:[%s]\n”, szBuf);
292web浏览器网页入口_web浏览器网页入口    }

293web浏览器网页入口_web浏览器网页入口
294web浏览器网页入口_web浏览器网页入口    // read data.
295web浏览器网页入口_web浏览器网页入口    for (;;) {

296web浏览器网页入口_web浏览器网页入口        dwSize = BUF_SIZE;
297web浏览器网页入口_web浏览器网页入口        if (ReadData(hRequest, szBuf, dwSize, &dwSize) == FALSE) {

298web浏览器网页入口_web浏览器网页入口            break;
299web浏览器网页入口_web浏览器网页入口        }

300web浏览器网页入口_web浏览器网页入口
301web浏览器网页入口_web浏览器网页入口        if (dwSize <= 0) {

302web浏览器网页入口_web浏览器网页入口            break;
303web浏览器网页入口_web浏览器网页入口        }

304web浏览器网页入口_web浏览器网页入口
305web浏览器网页入口_web浏览器网页入口        szBuf[dwSize] = 0;
306web浏览器网页入口_web浏览器网页入口        printf(“%s\n”, szBuf);    //Output value = value1 + value2
307web浏览器网页入口_web浏览器网页入口    }

308web浏览器网页入口_web浏览器网页入口
309web浏览器网页入口_web浏览器网页入口    CloseInternetHandle(hRequest);
310web浏览器网页入口_web浏览器网页入口    CloseInternetHandle(hConnect);
311web浏览器网页入口_web浏览器网页入口    CloseInternetHandle(hSession);
312web浏览器网页入口_web浏览器网页入口
313web浏览器网页入口_web浏览器网页入口    return 0;
314web浏览器网页入口_web浏览器网页入口}



315
web浏览器网页入口_web浏览器网页入口

=========================================================================================

wininet api函数使用经验点滴

一.使用HttpSendRequestEx后,如需使用HttpQueryInfo,需先用HttpEndRequest结束Request

二.BOOL HttpQueryInfo(
    IN HINTERNET hHttpRequest,
    IN DWORD dwInfoLevel,
    IN LPVOID lpvBuffer,
    IN LPDWORD lpdwBufferLength,
    IN OUT LPDWORD lpdwIndex,
);
lpdwBufferLength会返回所需的Buffer大小,因此如果多次使用此函数,需要多次对lpdwBufferLength赋值,否则会出现ERROR_INSUFFICIENT_BUFFER错误
示例程序:

hHttpFile=HttpOpenRequest(hConnect,"POST","/avlab/index.php",NULL,NULL,0, INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_RELOAD,0); HttpAddRequestHeaders(hHttpFile,szCookie,-1,HTTP_ADDREQ_FLAG_ADD); HttpAddRequestHeaders(hHttpFile,"Content-Type: application/x-www-form-urlencoded",-1,HTTP_ADDREQ_FLAG_ADD); HttpSendRequestEx(hHttpFile,&struInterIn,NULL,NULL,NULL); HttpEndRequest(hHttpFile,NULL,NULL,NULL); nLength=512;//这一句很重要,,因为HttpQueryInfo返回的时候,会改变此值 HttpQueryInfo(hHttpFile,HTTP_QUERY_SET_COOKIE,szBuffer,(unsigned long *)&nLength,NULL);

三.使用InternetReadFile一定要记得比较已经读取的字节数,以确定数据是否已经全部读完
     如果InternetReadFile未把response的数据读完,后续的request会被response数据淹没,而得不到服务端的及时响应或者无响应.这时候再HttpSendRequest,后续的HttpQueryInfo会不成功    

四.字符串操作时,一定要检查返回值,以防后续代码进行非法操作

五.
     如果向网页提交带参数的get或者post命令,网站需要处理时间,其返回网址的内容可能还没有更新过,如果需要获取更新后的内容,需要对更新前后的内容进行比较

六.
 HttpSendRequest或者HttpSendRequestEx发送消息后如果未接受到response,则会返回NULL,Error Code被设为12002,即超时错误,可以使用 InternetSetOption(hHttpFile,INTERNET_OPTION_SEND_TIMEOUT,&timeout,sizeof(DWORD));  设置超时时间

七.
     不能太依赖服务器提供的文件大小,因为有的时候服务器并不提供文件大小,此时如果再使用HttpQueryInfo获取大小,则会出错,GetLastError()返回值为12150

今天的文章
web浏览器网页入口_web浏览器网页入口分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89794.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注