CHttpFile

CHttpFile 發表評論(0) 編輯詞條

CHttpFile

CObject
 └CFile
    └CStdioFile
       └CInternetFile
          └CHttpFile

CHttpFile提供向HTTP服務器中請求和讀取的功能。
如果Internet會話要從一個HTTP服務器中讀取數據,則必須構造一個CHttpFile實例。
#include <afxinet.h>


CHttpFile類的成員

構造函數
CHttpFile 構造一個CHttpFile對象

操作
AddRequestHeaders 添加發往HTTP服務器的請求頭
SendRequest 向HTTP服務器發送請求
SendRequestEx 利用CInternetFile的Write或WriteString方法向HTTP服務器發送請求
EndRequest 利用EndRequestEx的成員函數結束HTTP服務器的請求
QueryInfo 返回來自HTTP服務器的回答或請求頭
QueryInfoStatusCode 獲取與HTTP請求相關聯的狀態號,並將其放到提供的dwStatusCode 參數中
GetVerb 獲取用於對HTTP服務器的請求的動詞
GetObject 獲取對HTTP服務器的請求中的動詞的目標對象
GetFileURL 獲取指定文件的URL
Close 關閉CHttpFile並釋放其資源

CHttpFile::AddRequestHeaders

BOOL ADDRequestHeaders( LPCTSTR pstrHeaders, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW, int dwHeadersLen = -1 );
BOOL ADDRequestHeaders( CString& str, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW );

返回值:
如果成功,則返回非零值,否則爲0。如果該調用失敗,Win32的函數GetLastError 會被調用,確定失敗的原因。

參數:
pstrHeaders 一個指向某字符串的指針,該字符串包含添加到請求中的頭。每個頭都必須以CR/LF結束。
dwFlags 修改新頭部的語義。可能爲以下幾種之一:
· HTTP_ADDREQ_FLAG_COALESCE 利用標記來添加後續頭部的第一個頭部,從而合併相同名字的頭部。例如,“Accept:audio/*”後的“Accept: text/*”導致形成一個唯一的頭部“Accept:text/*,audio/*”。考慮到從與合併或獨立頭一起發送的請求中收到的數據,要靠調用應用來保證一個有內聚力的體制。
· HTTP_ADDREQ_FLAG_REPLACE 執行移動和添加,替換當前頭。頭名稱將被用於移動當前頭,全值將被用於添加新頭。如果頭部值爲空且頭已被找到,則移走它。如果不爲空,則頭值被替換。
· HTTP_ADDREQ_FLAG_ADD_IF_NEW 如果不存在,則只需添加頭;如果有一個存在,則出錯返回。
· HTTP_ADDREQ_FLAG_ADD 與REPLACE一起使用。如果不存在,則添加頭。
dwHeadersLen pstrHeaders的長度,以字符計算。如果爲-1L,則pstrHeaders被假定爲是空終止的,且長度已被計算出來了。
str 一個CString對象的參考,包含請求頭或者將被添加的頭。

說明:
調用該成員函數,用來對HTTP請求操作添加一個或多個請求頭。AddRequestHeaders 增加附加的、形式自由的頭到HTTP請求操作中。其往往被高級客戶使用,他們需要對發往HTTP服務器的指定的請求進行具體控制。
注意:
對於使用HTTP_ADDREQ_FLAG_ADD或者HTTP_ADDREQ_FLAG_ADD_IF_NEW對AddRequestHeaders的調用,應用可在pstrHeaders 或str中,一次傳遞多個頭。如果應用試圖使用HTTP_ADDREQ_FLAG_REMOVE或HTTP_ADDREQ _FLAG_REPLACE來移動或替換一個頭,則lpszHeaders中只能提供一個頭。

CHttpFile::CHttpFile

CHttpFile( HINTERNET hFile, HINTERNET hSession, LPCTSTR pstrObject, LPCTSTR pstrServer, LPCTSTR pstrVerb, DWORD dwContext );
CHttpFile( HINTERNET hFile, LPCTSTR pstrVerb, LPCTSTR pstrObject, CHttpConnection* pConnection );

參數:
hFile Internet文件的句柄。
hSession Internet會話的句柄。
pstrObject 一個指向包含CHttpFile對象名稱的字符串的指針。
pstrServer 一個指向包含服務器名稱的字符串的指針。
pstrVerb 一個指向某字符串的指針,該字符串包含在發送請求時將要使用的方法,可能爲POST,HEAD或GET。
dwContext 一個CHttpFile對象的上下文標識符。請參閱說明,以瞭解有關該參數的更多信息。
pConnection 一個指向CHttpConnection對象的指針。

說明:
調用該成員函數來構造一個CHttpFile對象。
不能直接構造一個CHttpFile對象,但可以調用CInternetSession::OpenURL 或CHttpConnection::OpenRequest。
dwContext的缺省值由MFC從創建此CHttpFile對象的CInternetSession對象發送到CHttpFile對象。當調用CInternetSession::OpenURL 或CHttpConnection 來構造一個CHttpFile對象時,可覆蓋此缺省值,來設置你所選擇的值的上下文標識符。上下文標識符返回到CInternetSession::OnStatusCallback ,提供其所代表的對象狀態。

CHttpFile::Close

virtual void Close( );

說明:
關閉CHttpFile 並釋放其資源。只有在對SendRequest的成功調用或者一個CHttpFile對象被 OpenURL成功創建後,才能使用該成員函數。

CHttpFile::EndRequest

BOOL EndRequest(DWORD dwFlags = 0, LPINTERNET_BUFFERS lpBuffln = NULL, DWORD dwContext = 1);
  throw(CInternetException);

返回值:
如果成功,則返回非零值,否則爲0。如果此調用失敗,可通過檢查產生的CInternetException對象來確定錯誤原因。

參數:
dwFlags 描述此操作的標記。要了解適當標記的列表,請參閱聯機文檔“平臺SDK”中的HttpEndRequest。
lpBuffIn 指向描述此操作的輸入緩衝區的初始INTERNET_BUFFERS的指針。
dwContext CHttpFile操作的上下文標識符。請參閱說明,以瞭解此參數的更多信息。

說明:
調用此成員函數來結束用成員函數發送HTTP服務器的請求。
dwContext的缺省值由MFC從創建此CHttpFile對象的CInternetSession對象發送到CHttpFile對象。當調用CInternetSession::OpenURL 或CHttpConnection 來構造一個CHttpFile對象時,可覆蓋此缺省值,來設置你所選擇的值的上下文標識符。上下文標識符返回到CInternetSession::OnStatusCallback ,提供其所代表的對象狀態。

CHttpFile::GetFileURL

virtual CString GetFileURL( ) const;

返回值:
一個CString對象,包含一個參照與本文件相關聯資源的URL。

說明:
調用該成員函數,得到以URL表示的HTTP文件的名字。只有在對SendRequest的成功調用或者一個CHttpFile對象被OpenURL成功創建後,才能使用該成員函數。

CHttpFile::GetObject

CString GetObject( ) const;

返回值:一個包含對象名稱的CString對象。

說明:
調用該成員函數以瞭解與此CHttpFile相關聯的對象名稱。只有在對SendRequest的成功調用或者一個CHttpFile對象被OpenURL成功創建後,才能使用該成員函數。

CHttpFile::GetVerb

CString GetVerb( ) const;

返回值:一個包含HTTP動詞名的CString對象。

說明:
調用該成員函數以瞭解與此CHttpFile相關聯的HTTP動詞。只有在SendRequest 被成功調用或者一個CHttpFile對象被 OpenURL成功創建後,才能使用該成員函數。

CHttpFile::QueryInfo

BOOL QueryInfo( DWORD dwInfoLevel, LPVOID lpvBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex = NULL ) const;
BOOL QueryInfo( DWORD dwInfoLevel, CString& str, LPDWORD dwIndex = NULL) const;
BOOL QueryInfo( DWORD dwInfoLevel, SYSTEMTIME* pSysTime, LPDWORD dwIndex = NULL ) const;

返回值:
如果成功,則返回非零值,否則爲0。如果此調用失敗,可通過調用Win32的函數GetLastError來確定錯誤原因。

參數:
dwInfoLevel 查詢屬性和下列指定所須信息標誌的組合:
· HTTP_QUERY_CUSTOM 查找頭名稱並在輸出中返回lpvBuffer中的值。如果未找到,HTTP_QUERY_CUSTOM 產生斷言。
· HTTP_QUERY_FLAG_REQUEST_HEADERS 是典型的,此應用查詢請求頭,但一個應用也可通過使用此標記查詢請求頭。
· HTTP_QUERY_FLAG_SYSTEMTIME 對於那些值爲日期/時間字符串的頭,如“Last-Modified-Time”,此標記返回如標準Win32SYSTEMTIME結構的頭值,而不需應用對數據進行文法分析映射。如果使用了此標記,你可能要使用SYSTEMTIME 覆蓋此函數。
· HTTP_QUERY_FLAG_NUMBER 對於那些值爲數字的頭,如狀態號,此標記返回一個32位的數據。
請參閱說明部分以瞭解可能值的列表。
lpvBuffer 一個指向用於接收信息的緩衝區的指針。
lpdwBufferLength 在入口處,這是指向一個用字節或位表示的包含數據緩衝區長度的值。請參閱說明部分以瞭解此參數的詳細信息。
lpdwIndex 一個指向基於零的頭索引的指針。可以爲NULL。使用此標記來枚舉同名的多個頭。對於輸入,lpdwIndex表示返回的指定的頭的索引。對於輸出,lpdwIndex 表示下一個頭的索引。如果此索引找不到,則返回ERROR_HTTP_HEADER_NOT_FOUND。
str 接收返回信息的CString對象的參考值。
dwIndex 一個索引值。請參閱lpdwIndex。
pSysTime 一個指向Win32 SYSTEMTIME結構的指針。

說明:
調用此成員函數返回HTTP請求中的回答或請求頭。只有在SendRequest被成功調用或者一個CHttpFile對象被 OpenURL成功創建後,才能使用該成員函數。
你可從QueryInfo中獲取以下數據類型:
· strings (缺省)
· SYSTEMTIME (對於“Data:”“Expires:”等)
· DWORD (對於 STATUS_CODE,CONTENT_LENGTH等等)
當一個字符串被寫入緩衝區,且成員函數成功時,lpdwBufferLength 包含字符串的字節長減一,去掉結束NULL字符的長度。
可能的dwInfoLevel值包括:
· HTTP_QUERY_MIME_VERSION
· HTTP_QUERY_CONTENT_TYPE
· HTTP_QUERY_CONTENT_TRANSFER_ENCODING
· HTTP_QUERY_CONTENT_ID
· HTTP_QUERY_CONTENT_DESCRIPTION
· HTTP_QUERY_CONTENT_LENGTH
· HTTP_QUERY_ALLOWED_METHODS
· HTTP_QUERY_PUBLIC_METHODS
· HTTP_QUERY_DATE
· HTTP_QUERY_EXPIRES
· HTTP_QUERY_LAST_MODIFIED
· HTTP_QUERY_MESSAGE_ID
· HTTP_QUERY_URI
· HTTP_QUERY_DERIVED_FROM
· HTTP_QUERY_LANGUAGE
· HTTP_QUERY_COST
· HTTP_QUERY_WWW_LINK
· HTTP_QUERY_PRAGMA
· HTTP_QUERY_VERSION
· HTTP_QUERY_STATUS_CODE
· HTTP_QUERY_STATUS_TEXT
· HTTP_QUERY_RAW_HEADERS
· HTTP_QUERY_RAW_HEADERS_CRLF


CHttpFile::QueryInfoStatusCode

BOOL QueryInfoStatusCode( DWORD& dwStatusCode ) const;

返回值:
如果成功,則返回非零值,否則爲0。如果此調用失敗,可通過調用Win32的函數GetLastError來確定錯誤原因。

參數:
dwStatusCode 狀態號的參考值。狀態號標識請求事件是成功還是失敗。請參閱說明部分,以瞭解狀態號的細節。

說明:
調用此成員函數以獲得HTTP請求相關聯的狀態號並將其放到所提供的dwStatusCode 參數中。只有在SendRequest 被成功調用或者一個CHttpFile對象被 OpenURL成功創建後,才能使用該成員函數。
分組的HTTP 狀態號標識請求的成功或失敗。以下列表列出了狀態號組及大部分常用狀態號。
分組 含義
200-299 成功
300-399 信息
400-499 請求錯誤
500-599 服務器錯誤
常用的HTTP狀態號:
狀態號 含義
200 URL定位,接着傳輸
400 不可理解的請求
404 所請求的URL未找到
405 服務器不支持所請求的方法
500 未知的服務器錯誤
503 已達到服務器容量

CHttpFile::SendRequest

BOOL SendRequest( LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLen = 0, LPVOID lpOptional = NULL, DWORD dwOptionalLen= 0 );
  throw(CInternetException);
BOOL SendRequest( CString& strHeaders, LPVOID lpOptional = NULL, DWORD dwOptionalLen = 0 );
  throw(CInternetException);

返回值:
如果成功,則返回非零值,否則爲0。如果此調用失敗,可通過檢查產生的CInternetException對象來確定錯誤原因。

參數:
pstrHeaders 一個指向包含着要發送的頭名稱的字符串的指針。
dwHeadersLen 由pstrHeaders指定的頭的長度。
lpOptional 在請求頭後立即發送的任意選項數據。通常用於POST和PUT操作。如果沒有待發送的選項數據,則可能爲NULL。
dwOptionalLen lpOptional的長度。
strHeaders 一個包含着正被髮送的請求的頭名稱的字符串。

說明:調用此成員函數以向HTTP服務器發送請求。


CHttpFile::SendRequestEx

BOOL SendRequestEx(DWORD dwTotalLen, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1);
  throw(CInternetException);
BOOL SendRequestEx(LPINTERNET_BUFFERS lpBuffIn, LPINTERNET_BUFFERS lpBuffOut, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1);
  throw(CInternetException);

返回值:
如果成功,則返回非零值,否則爲0。如果此調用失敗,可通過檢查產生的CInternetException對象來確定錯誤原因。

參數:
dwTotalLen 請求中將被髮送的字節數。
dwFlags 描述操作的標記。要了解適當標記的列表,請參閱聯機文檔“平臺SDK”中的HttpSendRequstEx。
dwContext CHttpFile操作的上下文標識符。請參閱說明部分關於此參數的更多信息。
lpBuffIn 一個指向描述操作中用到的輸入緩衝區的初始化了的INTERNET_BUFFERS的指針。
lpBufferOut 一個指向描述操作中用到的輸出緩衝區的初始化了的INTERNET_BUFFERS的指針。

說明:
調用此成員函數來向一個HTTP 服務器發送請求。此函數允許應用使用CInternetFile的Write和WriteString 來發送數據。在調用任一此函數的覆蓋前,必須知道發送的數據長度。第一個覆蓋允許確定你要發送的數據長度。第二個覆蓋接收指向INTERNET_BUFFERS結構的指針,它可以用來詳細地描述緩衝區。
當內容已被寫入文件時,調用EndRequest來結束此操作。
dwContext的缺省值由MFC從創建此CHttpFile對象的CInternetSession對象發送到CHttpFile對象。當調用CInternetSession::OpenURL 或CHttpConnection 來構造一個CHttpFile對象時,可覆蓋此缺省值,來設置你所選擇的值的上下文標識符。上下文標識符返回到CInternetSession::OnStatusCallback ,提供其所代表的對象狀態。請參閱聯機文檔“Visual C++程序員指南”中的“Internet初步:WinInet”,以瞭解有關上下文標識符的更多信息。

示例:
此代碼段發送一個字符串的內容到名爲ISAPI的DLL 中,DLL在服務器中爲MOOSEBOY。此示例對WriteString的調用只有一個,但可以使用多個來發送成塊數據。
CString strData = "Some very long data to be POSTed here!";
pServer = sess.GetHttpConnection("mooseboy");
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, "/isapi.dll?");
pFile->SendRequestEx(strData.GetLength());
pFile->WriteString(strData);
pFile->EndRequest();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章