- void GetGifFromInternet()
- {
- CInternetSession interSess;
- CHttpConnection* pHttpConn = interSess.GetHttpConnection(_T("www.baidu.com"), // A line
- (INTERNET_PORT)INTERNET_DEFAULT_HTTP_PORT, NULL, NULL);
- if (NULL == pHttpConn)
- return;
- // 這個函數的參數至關於設置HTTP頭,第二個參數指出所要請求的資源web子路徑,它這裏是請求圖片/img/baidu_sylogo1.gif,它的根路徑是www.baidu.com,
- // 也就是A line第一個參數www.baidu.com.最終,系統會造成所請求資源的全路徑:http://www.baidu.com/img/baidu_sylogo1.gif
- // 對於第3個參數,從msdn描述來看,彷佛是指出資源(baidu_sylogo1.gif)的路徑,不過它爲能夠爲NULL,彷佛沒有用,也就是說它不會影響資源
- // 全路徑的組合,不會影響C line的調用.不曉得怎麼回事???????.
- // 第5個參數ppstrAcceptTypes指出請求資源的類型,默認爲text/*,也就是文本,若是你請求的是圖片,那麼要包含圖片類型,例如img/gif等.能夠看出
- // 應該傳入LPCTSTR數組指針,可是很奇怪,數組的值怎麼樣,都會致使函數執行失敗,那麼要爲這個數組傳遞怎樣的值才能成功調用該函數呢?
- DWORD dwFlag = INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES;
- CHttpFile* phttpfile = pHttpConn->OpenRequest(_T("GET"), _T("/img/baidu_sylogo1.gif")); // B Line
- if (NULL == phttpfile)
- return;
- // A line 和 B line會組合成完整的URL:http://www.baidu.com/img/baidu_sylogo1.gif
- // 且該函數會返回該URL.B行的第3個參數不會影響C調用返回值.
- // 也就是說,若是A line第1個參數和B line第2個參數設置不正確,則不可以組合成一個有效的URL,會致使
- // 下面對SendRequest函數調用錯誤.
- CString url = phttpfile->GetFileURL(); // C line
- // A line,B line 都至關於添加了HTTP頭,然而程序可能會修改這個HTTP頭,D line的調用提供了一種修改HTTP頭的方法.
- // 能夠添加,修改,替代等.在這裏, D line的目的僅僅是修改了HTTP頭中Accept的的值,指出客戶端能夠接收的數據,能夠
- // 看到它包含p_w_picpath/gif,指出能夠接收gif文件.若是不指定這一項,OS默認只接受text/*,也就是文本數據.
- // 注意: HTTP頭有多項,OS默認設置了一些,因此程序能夠省略,有些項是能夠沒有的.
- // HTTP頭不是那麼容易寫的,在編程能夠在瀏覽器中請求某個資源,而後用抓包工具抓取到這個數據包,而後就能夠看到HTTP頭
- // 的,將該HTTP頭中的內容選擇必要的部分複製下來,在這裏組合成字符串便可.
- // 這個HTTP頭有些是可省略的,至於哪些能夠省略,這就須要先測試一下.
- LPCTSTR lpHeader =
- _T("GET /img1/baidu_sylogo1.gif /HTTP/1.1") // a1
- _T("Accept: application/x-ms-application, p_w_picpath/jpeg, application/xaml+xml, p_w_picpath/gif, p_w_picpath/pjpeg, application/x-ms-xbap, */*")
- _T("Accept-Language: zh-CN") //a2
- _T("Host: www.baidu.com") //a3
- _T("User-Agent: MFCAppTest.exe")
- _T("Connection: Keep-Alive")//a4
- _T("\r\n\r\n");
- // 若是dwFlags==HTTP_ADDREQ_FLAG_ADD_IF_NEW,a1,a2,a3,a4也能夠省略.
- BOOL bRet = phttpfile->AddRequestHeaders(lpHeader);// D line
- DWORD dwErr = ::GetLastError();
- // 請求的資源路徑不能改變,它的值仍然應同 C Line調用時相同.
- url = phttpfile->GetFileURL(); // E line
- bRet = phttpfile->SendRequest(); // F line 發送請求gif文件數據的請求.
- CString ojb = phttpfile->GetObject(); // 獲取的資源名稱,這裏是baidu_sylogo1.gif
- TCHAR buf[BUF_4096] = {0};
- DWORD dwBytes = BUF_4096-1;
- DWORD dwIndex = 0;
- // HTTP_QUERY_CONTENT_TYPE 若是F line執行成功,這裏應該返回img/gif.
- bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, buf, &dwBytes, &dwIndex);
- dwErr = ::GetLastError();
- // 請求到的數據長度,也就是baidu_sylogo1.gif的大小.
- dwBytes = BUF_4096-1;
- dwIndex = 0;
- bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, buf, &dwBytes, &dwIndex);
- dwErr = ::GetLastError();
- // 請求到的數據長度,也就是baidu_sylogo1.gif的大小.
- int len = phttpfile->GetLength();
- // 讀取baidu_sylogo1.gif文件數據,而後以二進制形式保存下來.
- int nBytes = _tstoi(buf);
- dwBytes = phttpfile->Read(buf, nBytes);
- FILE* file = fopen("g:\\pic.gif", "wb");
- fwrite(buf, nBytes, 1, file); // 保存以後能夠看到pic.gif文件,並能夠利用圖片查看工具查看.
- fclose(file);
- }