"GET", // 2 LPCTSTR lpszVerb
"/MSDN/MSDNINFO/", // 3 LPCTSTR lpszObjectName
HTTP_VERSION, // 4 LPCTSTR lpszVersion
NULL, // 5 LPCTSTR lpszReferer
0, // 6 LPCTSTR FAR * lplpszAcceptTypes
INTERNET_FLAG_DONT_CACHE, // 7 DWORD dwFlags
0 // 8 DWORD dwContext
) ;
到现在为止,
网络函数的许多参数看起来都类似。HttpOpenResult的第一个参数是由InternetConnet返回的 HINTERNET。HttpOpenRequest的第七和第八个参数执行与InternetConnect中有相同名字的参数一样的功能。
第二个参数(“GET”)指定我们想要得到由第三个参数(“/MSDN/MSDNINFO/”)命名的对象。HTTP版已经传递第四个参数;现在,它肯定是HTTP棗VERSION。因为“GET”是最流行的动词类型,HttpOpenRequest将为这个参数接收一个空指针。
第五个参数lpszReferer是一个网点的地址。在这个网点上我们发现了我们现在想要看见的URL(统一资源定位)。换而言之,如果你在
www.home.com上而且单击了跳到
www.microsoft.com的一个连接,第五个参数就是
www.home.com。因为它使你指向了目标URL(统一资源定位)。这个值可以为空。第六个参数执行一个我们的程序接收的文件类型列表。把空值传递给HttpOpenRequest即通知了服务器只有文本文件可以被接收。
HttpSendRequest
除了传送请求外,HttpSendRequest允许你传送额外的HTTP标题给服务器。关于HTTP标题的信息可以在
http://www.w3.org/ 上的最新的说明上找到。在这个例子中,HttpSendRequest的所有参数都被传递为缺省值。
BOOL bSendRequest = ::HttpSendRequest(
hHttpFile, // 1 HINTERNET hHttpRequest
NULL, // 2 LPCTSTR lpszHeaders
0, // 3 DWORD dwHeadersLength
0, // 4 LPVOID lpOptional
0 // 5 DWORD dwOptionalLength
);
HttpQueryInfo
为了得到关于文件的信息,在调用HttpSendRequest后使用HttpQueryInfo函数:
BOOL bQuery = ::HttpQueryInfo(
hHttpFile, // 1 HINTERNET hHttpRequest
HTTP_QUERY_CONTENT_LENGTH, // 2 DWORD dwInfoLevel
bufQuery, // 3 LPVOID lp
vbuffer
&dwLengthBufQuery // 4 LPDWORD lpdwBufferLength
) ;
查询的结构是字符串或lp
vbuffer中的字符串列表。HTTP_QUERY_CONTENT_LENGTH查询得到文件的长度。你可以使用HttpQueryInfo查询大范围的信息。要获知详细情形可查阅网点
http://www.microsoft.com/intdev/sdk/docs/wininet上的Microsoft Win32
网络函数专题。
SurfBear样本应用程序
SurBear样本应用程序使用Win32
网络函数从Internet上得到文件并且在编辑器上显示原始的HTML格式。SurfBear使用HttpOpenRequest和HttpSendRequest取代InternetOpenUrl,纯粹是为了演示的需要。
图2 SurfBear 屏幕
SurfBear是一个MFC4.0版本的对话应用程序。它所有与Internet有关的功能都在InternetThread.h和InternetThread.cpp文件中。
从internet上读取文件要花费相当数量的时间,所以从一个工作线程调用
网络函数是一个明智的主意。通过这种方式,当系统在等待得到数据时,应用程序的窗口能被改变尺寸和移动。
图3显示了SurfBear的控制流。
当用户按下GOTO按钮时,CsurfBearDlg::OnBtnGoto调用CinternetThread:GetWebPoge,传递想要的web页的HTTP地址。GetWebPage把HTTP地址语法分析成服务器和对象名,存储在CinternetThread的成员变量中。GetWebPage然后调用AfxBeginThread,它产生一个运行静态成员函数的线程GetWebPage WorkerThread。如果
网络函数没有被初始化,GetWebPageWorkerThread调用InternetOpen,然后它尝试读取想要的web页。当GetWebPageWorkerThread结束时,它发送一个用户定义的WM_READFILECOMPLETED消息给SurfBear对话框。OnReadFileCompleted处理这个消息并且把一个web页复制到编辑器控制里。
总结
Win32
网络函数使从FTP,Gopher和HTTP服务器上读取信息就想从你的硬盘驱动器上读取信息一样容易。仅仅使用4个函数棗InternetOpen,InternetOpenUrl,InternetReadFile和InternetCloseHandle和很少的HTTP知识,你就可以写一个简单的
网络浏览器。