在VC中通過HTTP方式獲取網頁,我試過好幾種方式,但是都有問題,現將我用的兩種雖然也有問題但基本可以實現的方式寫出來,如果大家有更好的方式或者能解決我所遇到的問題,請告訴我:QQ158792331,郵箱:[email protected]
第一種:
首先要包含這個頭文件:#include <afxinet.h>
CInternetSession mySession;
CHttpFile* myHttpFile=NULL;
CString myData;
myHttpFile=(CHttpFile*)mySession.OpenURL(url,1,INTERNET_FLAG_DONT_CACHE,NULL,0);
for(int i=0;i<20&&myHttpFile->ReadString(myData);i++)
{
strXMLReturn+=myData+" "; //因為每次只能讀取一行,所以要循環讀取數據
}
myHttpFile->Close();
delete []myHttpFile;
mySession.Close();
CInternetSession::OpenURL函數原型為:
CStdioFile* OpenURL( LPCTSTR pstrURL, //文件URL地址
DWord dwContext = 1, //上下文ID
DWord dwFlags = INTERNET_FLAG_TRANSFER_ASCII, //標記
LPCTSTR pstrHeaders = NULL, //發送到服務器的數據頭
DWord dwHeadersLength = 0 );//發送到服務器的數據頭長度
dwFlags可以為:
INTERNET_FLAG_RELOAD 強制重讀數據
INTERNET_FLAG_DONT_CACHE 不保存到緩存
INTERNET_FLAG_TRANSFER_ASCII 使用文本數據
INTERNET_FLAG_TRANSFER_BINARY 使用二進制數據
不知道為什麼這個函數當只用一個或者兩個參數時不會報錯,用三個或者按原形就會報錯,但是用一個或者兩個當頁面更新時,不能獲取到最新的數據(默認總是先檢查緩存是否有要的數據)
第二種:
首先引用:
#import <msXML4.dll> named_guids
using namespace MSXML2;
CString resaa;
IXMLHTTPRequestPtr httpRes;
HRESULT hr=httpRes.CreateInstance("MSXML2.XMLHTTP");
if(!SUCCEEDED(hr))
{
AfxMessageBox("無法創建XMLHTTP對象,請檢查是否安裝了MS XML運行庫!");
}
LPCTSTR url="http://localhost/changjun/asXML.ASP";
httpRes->open("Get",url,false,"","");
httpRes->send();
if((httpRes->readyState)==4) //4時表示數據已加載完
{
resaa=httpRes->responseText.copy();
}
httpRes.Release();
用這種方式返回值的默認編碼方式為UTF-8,所以除了Google中國的網頁能正常顯示,其他的頁面都是亂碼,本想將返回值重新編碼,但水平所限,我沒有成功,如果誰解決了這個問題,不要忘記告訴我啊