使用到的類:
RHTTPTransaction :
http處理類。包括請求和應答。通過RHTTPSession::OpenTransactionL()創建並打開。
RSocketServ :
socket服務器類。RSocketServ::connect()用來建立客戶端到socket服務器的進程之間的通信。
RConnection :
網絡連接管理接口類。
RHTTPSession:
HTTP會話類。
RStringPool:
字符串池類。存放HTTP字符串表,包括:方法名字,包頭名字等等。
RHTTPConnectionInfo:
HTTP連接類。用於設置和獲得HTTP的一些屬性值。
MHTTPTransactionCallback:
觀察器類,類似於CBrCtlInterface觀察器MBrCtlLoadEventObserver
回調函數MHFRunL:
void MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent )
回調函數MHFRunError:
TInt MHFRunError( TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent );
使用時,繼承該類並實現其回調函數,在回調函數MHFRunL中實現對HTTP 處理中各個事件的操作。
在回調函數MHFRunL中實現對傳輸出錯的處理。
使用RHTTPSession::OpenTransactionL()將自身設置爲RHTTPSession對象的觀察器,當發生各種傳輸事件或傳輸出錯時,會自動調用回調函數。
MHTTPAuthenticationCallback:
觀察器類,用於需要身份認證(authentication)的http請求。
內聯函數InstallAuthenticationL:
void InstallAuthenticationL(RHTTPSession aSession)
用於將自身設置爲aSession得回調函數。傳入的實參必須是一個已經OpenL()的RHTTPSession。
回調函數GetCredentialsL:
TBool GetCredentialsL(const TUriC8& aURI, RString aRealm, RStringF aAuthenticationType,
RString& aUsername, RString& aPassword)
使用時,繼承該類並實現其回調函數,在該回調函數中將用戶名和密碼傳入回調函數參數。
通過內聯函數設置自身爲RHTTPSession對象的觀察器,當http請求需要authentication時候,會自動調用回調函數。
其他相關類:RHTTPResponse RHTTPHeaders THTTPHdrFieldIter
HTTP請求及連接步驟:
1.創建會話
iSession.OpenL()
iHTTPAuthenticationObserver->InstallAuthenticationL( iSession );
2.如果存在已建立的transaction。關閉transaction。
iTransaction.Close();
3.創建並打開與socket服務器的連接
iSocketServ.Connect()
iConnection.Open(iSocketServ)
iConnection.Start()
4.設置HTTP連接
iSession.ConnectionInfo().SetPropertyL (
iSession.StringPool().StringF(HTTP::EHttpSocketServ,
RHTTPSession::GetTable() ), THTTPHdrVal (iSocketServ.Handle()) )
iSession.ConnectionInfo().SetPropertyL
( iSession.StringPool().StringF(HTTP::EHttpSocketConnection,
RHTTPSession::GetTable() ), THTTPHdrVal (REINTERPRET_CAST(TInt,
&(iConnection))));
5.打開傳輸
TUriParser8 uri;
uri.Parse( aUri );
RStringF method = iSession.StringPool().StringF( HTTP::EGET, RHTTPSession::GetTable());
iTransaction = iSession.OpenTransactionL( uri, *iHTTPTransactionObserver, method );
6.設置請求包頭
RStringF valStr = iSession.StringPool().OpenFStringL( KUserAgent);
THTTPHdrVal val( valStr );
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
hdr.SetFieldL( iSession.StringPool().StringF( HTTP::EUserAgent, RHTTPSession::GetTable() ), val );
RStringF valStr = iSession.StringPool().OpenFStringL( KAccept );
THTTPHdrVal val( valStr );
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
hdr.SetFieldL( iSession.StringPool().StringF( HTTP::EAccept, RHTTPSession::GetTable() ), val );
7.提交傳輸
iTransaction.SubmitL();
8.HTTP連接的關閉:
iTransaction.Close();
兩個觀察器的實現:
- void CHTTPTransactionObserver::MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent )
- {
- switch ( aEvent.iStatus )
- {
- case THTTPEvent::EGotResponseHeaders:
- {
- //................................
- //................................
- break ;
- }
- case THTTPEvent::EGotResponseBodyData:
- {
- //................................
- //................................
- TPtrC8 dataChunk;
- aTransaction.Response().Body()->GetNextDataPart( dataChunk );
- body->ReleaseData();
- break ;
- }
- case THTTPEvent::ESucceeded:
- {
- //................................
- //................................
- aTransaction.Close();
- break ;
- }
- case THTTPEvent::EFailed:
- {
- //................................
- //................................
- aTransaction.Close();
- break ;
- }
- default :
- {
- //................................
- //................................
- break ;
- }
- }
- }
- TInt CHTTPTransactionObserver::MHFRunError( TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
- {
- //................................
- //................................
- }
- TBool CHTTPAuthentication::GetCredentialsL( const TUriC8& aUri,
- RString aRealm,
- RStringF aAuthenticationType,
- RString& aUsername,
- RString& aPassword)
- {
- TRAPD(err, aUsername = aRealm.Pool().OpenStingL( KUserName));
- if ( !err )
- {
- TRAPD( err, aPassword = aRealm.Pool().OpenStingL( KPassword ) );
- if ( !err )
- return ETRUE;
- }
- return EFalse;
- }