symbian下的http連接

使用到的類:

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();

兩個觀察器的實現:

  1. void  CHTTPTransactionObserver::MHFRunL( RHTTPTransaction aTransaction,  const  THTTPEvent& aEvent )  
  2.     {  
  3.     switch  ( aEvent.iStatus )   
  4.         {  
  5.         case  THTTPEvent::EGotResponseHeaders:  
  6.             {  
  7.             //................................   
  8.             //................................   
  9.             break ;  
  10.             }  
  11.         case  THTTPEvent::EGotResponseBodyData:  
  12.             {  
  13.             //................................   
  14.             //................................   
  15.             TPtrC8 dataChunk;  
  16.             aTransaction.Response().Body()->GetNextDataPart( dataChunk );  
  17.             body->ReleaseData();       
  18.             break ;  
  19.             }  
  20.         case  THTTPEvent::ESucceeded:  
  21.             {  
  22.             //................................   
  23.             //................................   
  24.             aTransaction.Close();         
  25.             break ;  
  26.             }  
  27.          case  THTTPEvent::EFailed:  
  28.             {  
  29.             //................................   
  30.             //................................   
  31.             aTransaction.Close();         
  32.             break ;  
  33.             }  
  34.         default :  
  35.             {  
  36.             //................................   
  37.             //................................   
  38.             break ;  
  39.             }  
  40.         }  
  41.    
  42.     }  
  43.     
  44.     
  45. TInt CHTTPTransactionObserver::MHFRunError( TInt aError, RHTTPTransaction aTransaction, const  THTTPEvent& aEvent)  
  46.     {                            
  47.     //................................   
  48.     //................................    
  49.     }  
  50.                                       
  51.                                       
  52. TBool CHTTPAuthentication::GetCredentialsL( const  TUriC8& aUri,  
  53.                                                RString aRealm,   
  54.                                                RStringF aAuthenticationType,  
  55.                                                RString& aUsername,   
  56.                                                RString& aPassword)   
  57.     {          
  58.     TRAPD(err, aUsername = aRealm.Pool().OpenStingL( KUserName));  
  59.     if ( !err )  
  60.         {  
  61.         TRAPD( err, aPassword = aRealm.Pool().OpenStingL( KPassword ) );  
  62.         if ( !err )  
  63.         return  ETRUE;  
  64.         }  
  65.     return  EFalse;  
  66.     } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章