| function WinInetDownload(Url:PChar; fs:TStream):Boolean; var hSession : HINTERNET; hOpenUrl : HINTERNET; Temp : array [0..MAXBLOCKSIZE-1] of Byte; dwRead : DWORD; dwResult : DWORD; agent:string; begin Result := False; agent:='Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Coolpad 8122 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'; hSession := InternetOpen(PChar(agent), //指定調(diào)用 WinINet 函數(shù)的應用程序或入口。該入口用作HTTP協(xié)議中用戶代理項。 INTERNET_OPEN_TYPE_PRECONFIG,//訪問要求類型,該參數(shù)可為下列值之一: { INTERNET_OPEN_TYPE_DIRECT 解析所有本地主機; INTERNET_OPEN_TYPE_PRECONFIG 返回注冊表中代理或直接的配置; INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 返回注冊表中代理或直接的配置,并防止對Microsoft Jscript 或 INS文件的使用; INTERNET_OPEN_TYPE_PROXY 為代理傳遞請求,除非代理提供了旁路列表且解析的名字可以繞過代理;此時,函數(shù)使用INTERNET_OPEN_TYPE_DIRECT。} nil, //指定了當lAccessType類型為INTERNET_OPEN_TYPE_PROXY時,代理服務器的名字。 nil, //指向一個字符串,它指定一個可選的主機名列表或IP地址,列表可包括未知元素。 0); {該參數(shù)可為下列值的任意組合: INTERNET_FLAG_ASYNC 僅能用于作用在該函數(shù)返回的句柄的子句柄上的異步請求。 INTERNET_FLAG_FROM_CACHE 不做網(wǎng)絡請求。所有的實體都由緩存返回。如果請求條目不在緩存中,一個適當?shù)腻e誤將返回。 INTERNET_FLAG_OFFLINE 與 INTERNET_FLAG_FROM_CACHE 一樣。} //成功:返回一個有效的句柄,該句柄將由應用程序傳遞給接下來的WinINet函數(shù)。 //失?。悍祷豊ULL。 if hSession = nil then Exit; //通過一個完整的FTP,Gopher或HTTP網(wǎng)址打開一個資源。 hOpenUrl := InternetOpenUrl(hSession, //當前的 Internet 會話句柄。句柄必須由前期的 InternetOpen 調(diào)用返回。 Url, //一個空字符結(jié)束的字符串變量的指針,指定讀取的網(wǎng)址。只有以ftp:, gopher:, http:, 或者 https: 開頭的網(wǎng)址被支持。 nil, //一個空字符結(jié)束的字符串變量的指針,指定發(fā)送到HTTP服務器的頭信息。欲了解更多信息,請參閱HttpSendRequest函數(shù)里lpszHeaders參數(shù)的說明。 0, //額外的頭的大小,以TCHAR為單位。如果這個參數(shù)是-1L并且lpszHeaders不是NULL,lpszHeaders被假設為零終止( ASCIIZ ),而長度被自動計算。 0, //INTERNET_FLAG_DONT_CACHE, //不添加返回實體到緩存 {INTERNET_FLAG_EXISTING_CONNECT 如果使用相同的必須屬性創(chuàng)建會話,會嘗試利用現(xiàn)有的InternetConnect對象。這只對FTP操作非常有用,因為FTP是唯一在同一會話中執(zhí)行多種操作的協(xié)議。WinINet API 為每個由InternetOpen產(chǎn)生的HINTERNET句柄緩沖一個單獨鏈接句柄。InternetOpenUrl使用此標志的HTTP和FTP連接。 INTERNET_FLAG_HYPERLINK 當決定何時從網(wǎng)絡重載時,如果服務器沒有返回 Expires time 和 LastModified,那么強制重載。 INTERNET_FLAG_IGNORE_CERT_CN_INVALID 停用檢查從服務器對必須的主機名稱返回的SSL/PCT-based證書。 WinINet函數(shù)使用簡單的比較匹配主機名稱和通配符的規(guī)則檢查證書。 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 停用檢查的SSL/PCT-based的證書的適當?shù)挠行掌凇?br> INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 禁用檢測這中特殊的重定向。當使用此標志, WinINet 透明允許從HTTPS到HTTP URL的重定向。 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 禁用檢測這中特殊的重定向。當使用此標志, WinINet 透明的允許的HTTP到HTTPS URL的重定向。 INTERNET_FLAG_KEEP_CONNECTION 如果可能的話,為連接使用保活語義。這個標志要求微軟網(wǎng)絡( MSN ),NTLM和其他類型的身份驗證。 INTERNET_FLAG_NEED_FILE 如果要創(chuàng)建的文件不能被緩存,創(chuàng)建臨時文件。 INTERNET_FLAG_NO_AUTH 不試圖自動驗證。 INTERNET_FLAG_NO_AUTO_REDIRECT 不自動處理HttpSendRequest中的重定向。 INTERNET_FLAG_NO_CACHE_WRITE 不添加返回實體到緩存。 INTERNET_FLAG_NO_COOKIES 不會自動添加的Cookie頭到請求,并且不自動添加返回的cookie到cookie數(shù)據(jù)庫。 INTERNET_FLAG_NO_UI 禁用Cookie的對話框。 INTERNET_FLAG_PASSIVE 使用被動FTP語義。InternetOpenUrl為FTP的文件和目錄使用此標志。 INTERNET_FLAG_PRAGMA_NOCACHE 即使代理中存在緩存副本,也強制要求由源服務器返回。 INTERNET_FLAG_RAW_DATA 檢索的Gopher目錄信息時,傳回的數(shù)據(jù)作為GOPHER_FIND_DATA結(jié)構(gòu),如果檢索的FTP目錄信息時,作為一個WIN32_FIND_DATA結(jié)構(gòu)。如果此標志沒有指定,或者請求通過CERN代理創(chuàng)建, InternetOpenUrl返回的HTML版本的目錄。 INTERNET_FLAG_RELOAD 從原服務器強制下載所要求的文件,對象,或目錄列表,而不是從緩存下載。 INTERNET_FLAG_RESYNCHRONIZE 重新加載的HTTP資源,如果資源在最后一次下載后已被修改。所有FTP和Gopher資源將被重載。 INTERNET_FLAG_SECURE 使用安全傳輸語義。這次傳輸使用安全套字節(jié)層/專用通信技術(shù)(的SSL / PCT ),這只有在HTTP請求時有意義。 } 0); // 返回值 // 如果已成功建立到FTP,Gopher,或HTTP URL的連接,返回一個有效的句柄,如果連接失敗返回NULL。要檢索特定的錯誤訊息,請GetLastError 。要確定為什么對服務器的訪問被拒絕,請調(diào)用InternetGetLastResponseInfo。 if hOpenUrl = nil then Exit; try fs.Seek(0,soBeginning); dwRead := 1; while (dwRead > 0) do begin InternetReadFile(hOpenUrl, @Temp, MAXBLOCKSIZE, dwRead); fs.Write(Temp,dwRead); end; finally InternetCloseHandle(hOpenUrl); InternetCloseHandle(hSession); end; end; function GetUrl(url:string):Rawbytestring; var URLHTML : TStringStream ; ResultStr :string; begin URLHTML := TStringStream.Create('');//, TEncoding.GetEncoding(936)); WinInetDownload(PChar(Url) ,URLHTML ); Result :=PAnsiChar(URLHTML.Memory); // URLHTML .free; end; { procedure test(url:string):string; var ResultStr :string; rawstr:rawByteString; begin rawStr := GetUrl(url); ResultStr := UTF8Decode(rawStr); // memo1.Lines.Text:=ResultStr; end; } 下面這個是字符串轉(zhuǎn)換函數(shù) function StringChange(URLStr, UTF8str, Encode: Boolean; in_str: string): string; begin Result := in_str; try if Encode then begin if URLStr then begin if UTF8str then Result := HTTPEncode(UTF8Encode(Result)) else Result := HTTPEncode(Result); end else if UTF8str then Result := UTF8Encode(Result); end else begin if URLStr then begin if UTF8str then Result := HTTPDecode(UTF8Decode(Result)) else Result := UTF8Decode(Result); end else begin if UTF8str then Result := UTF8Decode(Result); end; end; except Result := in_str; end; end; 引用 HTTPApp | 
|  |