symbian下的http连接

    技术2026-01-11  5

    使用到的类:

    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;       } 
    最新回复(0)