使用到的类:
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();
两个观察器的实现:
view plain copy to clipboard print ? 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; }