蛙泳视频教学视频教程:Symbian下的Http连接 - sunny05296的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/04/25 08:35:30

Symbian下的Http连接

文档 2010-07-22 15:14:36 阅读99 评论0   字号: 订阅

Symbian下的Http连接

相关类(Class):

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

总结:

根据SDK中关于众多API的阐述,可以描出一个HTTP client程序的框架。

首先是调用RHTTPSession::OpenL()打开一个Session,通过RHTTPSession::ConnectInfo()方法来设置Session的property,通常是包括HTTP::EHttpSocketServ和HTTP::EHttpSocketConnection。

然后调用RHTTPSession::OpenTransactionL()来关联这个Session的Transaction,在此方法中需要明确request的URI,方法和MHTTPTransactionCallback这个回调。URI是一个请求的网址,方法可以是HTTP::EGET或是HTTP:EPOST等等,callback就是继承这个observer的class,它告诉AS在server的response来的时候调用observer::MHFRunL()方法。接下来,我们需要填充request的header字段告诉server一些client的信息,比如:HTTP::EUSERAGENT、HTTP::EACCEPT。此功能可以通过RHTTPHeaders类来实现。

最后是调用RHTTPTransaction::SubmitL()方法提交这个transaction。

在SERVER端有response的时候,AS会调用MHFRunL()方法。其中有个THTTPEVENT方法表明事件类型,比如:EGotResponseHeaders,EGotResponseBodyData等等,结合另一个参数是RHTTPTransaction使用。比如:如果THTTPEVENT为EGotResponseHeaders,可以通过RHTTPTransaction的Response()的StatusCode()/StatusText()得到response的状态和文字信息。如果THTTPEVENT为EGotResponseBodyData,可以通过Response()的Body()方法获得一个指向MHTTPDataSupplier对象的指针,并通过其GetNextDataPart()方法获取数据,在处理完该部分数据后应该改调用ReleaseData()释放掉该数据。一次response的结束会有一个THTTPEvent::EResponseComplete表示response的完成,而THTTPEvent::ESucceeded则表示一个transaction的结束。MHTTPDataSupplier的GetNextDataPart()如果返回ETrue表明接收到的数据是最后一部分,但是也可能在收打最后一部分的时候其返回的不是ETrue,比如:没有内容长度域的多部分response,所以用EResponseComplete来表明body已经完全接收到要更可靠。

Symbian下的Http连接 - sunny05296的日志 - 网易博客 Symbian http 编程总结 - Simon的日志 - 网易博客 如何用电脑连接电视 - cwlgt1的日志 - 网易博客 eclipse如何连接oracle数据库? - Lee的日志 - 网易博客 如何让宽带自动连接? - 理睬的日志 - 网易博客 用电脑连接电视的方法[转] - β的日志 - 网易博客 - 风的影子的日志 - 网易博客 【引用】可连接40位博友的友情链接模块代码 - 心鏡大千的日志 - 网易博客 可连接40位博友的友情链接模块代码 - 千岛仙子的日志 - 网易博客 宽带连接错误的处理办法 - 闲人SGM的日志 - 网易博客 用电脑连接电视的方法 - 理睬的日志 - 网易博客 用电脑连接电视的方法 - 二泉映月的日志 - 网易博客 无法网络连接打印机的原因 - 萍水相逢的日志 - 网易博客 用一台主机连接两个显示器 - 山东豹的日志 - 网易博客 引用 如何用电脑连接电视 - sedeboke的日志 - 网易博客 如何用电脑连接电视 - 股海傲步 主升浪的日志 - 网易博客 【引用】引用 引用 怎样用电脑连接电视 - 东北雄鹰的日志 - 网易博客 静水首页模块在线连接代码【一】 - 静水澜语的日志 - 网易博客 电脑连接电视各方式优缺点 - 渴望美好的日志 - 网易博客 怎样用电脑连接电视 - 三和雨田的日志 - 网易博客 secureCRT连接到Linux - 随风飘散 的日志 - 网易博客 引用 引用 如何自动宽带连接 - 难忘知青的日志 - 网易博客 宽带连接常见错误提示及解决方法 - 沧海的日志 - 网易博客 经典手绘《聊斋志异》 下 - 香儿的日志 - 网易博客 引用 用电脑连接电视的方法 - 行龙于水的日志 - 网易博客 - lgn1182的日志 -...