HTTP应用学习有感

时间:2022-07-09 11:00:00

导语:HTTP应用学习有感一文来源于网友上传,不代表本站观点,若需要原创文章可咨询客服老师,欢迎参考。

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上的值并没有改变。