开篇:润墨网以专业的文秘视角,为您筛选了一篇HTTP应用学习有感范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
终于把自己练习的例子做完了,虽然心里还有些兴奋,但还觉得周期有些长,遂把这段时间的学习经验记录下来,同时也分享给SYMBIANC的新手们。
例子的主要功能:通过http查询彩票中奖信息。
WEB-SERVER方面:TOMCATJDK1.4JSPSERVLET实现,客户端通过发送HTTP请求,然后响应给客户端一段普通的文本,文本就是查询的彩票的中奖号码。例如:
其中dataPart为彩票的期数,服务器SERVLET产生响应的同时,把SESSIONID发送给客户端,这样客户端就可以把SESSIONID挂接到URL的后面来发送以后的请求,这样就不会在服务器端连续产生新的SESSION。关于SERVLET的实现,这里就不贴出例子了,着重手机客户端的代码实现。
手机客户端方面的开发,界面通过CarbideC的工程创建UI界面,在界面上拖放一个CEikEdwin,一个CEikLabel,然后定义命令菜单,值得注意的是:界面定义完成后,不要急于写代码,把界面调整完毕后,再开始写代码。若开始写代码了,觉得界面上少了其它控件,再添加其它控件的时候,以前编写的代码就丢失了。
这里我把关键的代码给贴出来,并加以说明:
classCLotteryContainerView:publicCAknView,MWebClientObserver{
................................//代码省略
private:
CConsoleBase*iConsole;
TBuf<32>sessionId;//用来保存服务器端产生的SESSIONID。
}
在CLotteryContainerView.CPP代码中,处理命令菜单的代码如下:
voidCLotteryContainerView::HandleCommandL(TIntaCommand)
{
//[[[begingeneratedregion:donotmodify[GeneratedCode]
TBoolcommandHandled=EFalse;
if(!commandHandled)
{
if(aCommand==ESearchCommand)
{
TBuf<200>buf;
TBuf<5>datePart;
this->iLotteryContainer->GetDatePart()->GetText(datePart);
if(sessionId.Length()==32)//如果已经取得了SESSIONID,则把SESSIONID添加到URL的参数中。
{
buf.AppendFormat(_L),&sessionId,&datePart);
}
else
{
buf.AppendFormat(_L("datePart);
}
TBuf8<600>url;
url.Copy(buf);
IssueHTTPGetL(&url);
}
下面的代码处理HTTP响应头信息
voidCLotteryContainerView::ClientHeaderReceivedL(CWebClientEngine&anEngine,constTDesC&aHeaderData)
{
TBuf<1000>bfHeader;
bfHeader.Copy(aHeaderData);
TIntpos=aHeaderData.Locate('''':'''');//获得'''':''''的位置
TPtrC16ptr16=bfHeader.Left(pos);
TIntresult=ptr16.Match(_L("JSESSIONID"));//匹配HTTP响应头中的StringHeader是否是JSESSIONID,对于不同的WEB-SERVER,SESSIONID的获得方式,可能会有不同。
if(result==0)//如果匹配,则把SESSIONID的字符串赋值给类的成员变量sessionId.
{
TPtrC16ptrSessionId=aHeaderData.Mid(pos2);
sessionId.Copy(ptrSessionId);
}
}
下面的代码用来处理HTTP响应的BODY信息。
voidCLotteryContainerView::ClientBodyReceivedL(CWebClientEngine&anEngine,constTDesC8&aBodyData)
{
TBuf<30>buf;
buf.Copy(aBodyData);
this->iLotteryContainer->GetLabel()->SetTextL(buf);//得到响应BODY后,把彩票结果赋值给LABEL。
this->iLotteryContainer->DrawDeferred();//这里,通知container,进行重绘操作。若不这样,有时会得到结果了,LABEL上的值并没有改变。