HTTP應(yīng)用學(xué)習(xí)有感
時(shí)間:2022-07-09 11:00:00
導(dǎo)語(yǔ):HTTP應(yīng)用學(xué)習(xí)有感一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
終于把自己練習(xí)的例子做完了,雖然心里還有些興奮,但還覺(jué)得周期有些長(zhǎng),遂把這段時(shí)間的學(xué)習(xí)經(jīng)驗(yàn)記錄下來(lái),同時(shí)也分享給SYMBIANC的新手們。
例子的主要功能:通過(guò)http查詢彩票中獎(jiǎng)信息。
WEB-SERVER方面:TOMCATJDK1.4JSPSERVLET實(shí)現(xiàn),客戶端通過(guò)發(fā)送HTTP請(qǐng)求,然后響應(yīng)給客戶端一段普通的文本,文本就是查詢的彩票的中獎(jiǎng)號(hào)碼。例如:
其中dataPart為彩票的期數(shù),服務(wù)器SERVLET產(chǎn)生響應(yīng)的同時(shí),把SESSIONID發(fā)送給客戶端,這樣客戶端就可以把SESSIONID掛接到URL的后面來(lái)發(fā)送以后的請(qǐng)求,這樣就不會(huì)在服務(wù)器端連續(xù)產(chǎn)生新的SESSION。關(guān)于SERVLET的實(shí)現(xiàn),這里就不貼出例子了,著重手機(jī)客戶端的代碼實(shí)現(xiàn)。
手機(jī)客戶端方面的開(kāi)發(fā),界面通過(guò)CarbideC的工程創(chuàng)建UI界面,在界面上拖放一個(gè)CEikEdwin,一個(gè)CEikLabel,然后定義命令菜單,值得注意的是:界面定義完成后,不要急于寫代碼,把界面調(diào)整完畢后,再開(kāi)始寫代碼。若開(kāi)始寫代碼了,覺(jué)得界面上少了其它控件,再添加其它控件的時(shí)候,以前編寫的代碼就丟失了。
這里我把關(guān)鍵的代碼給貼出來(lái),并加以說(shuō)明:
classCLotteryContainerView:publicCAknView,MWebClientObserver{
................................//代碼省略
private:
CConsoleBase*iConsole;
TBuf<32>sessionId;//用來(lái)保存服務(wù)器端產(chǎn)生的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)//如果已經(jīng)取得了SESSIONID,則把SESSIONID添加到URL的參數(shù)中。
{
buf.AppendFormat(_L),&sessionId,&datePart);
}
else
{
buf.AppendFormat(_L("datePart);
}
TBuf8<600>url;
url.Copy(buf);
IssueHTTPGetL(&url);
}
下面的代碼處理HTTP響應(yīng)頭信息
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響應(yīng)頭中的StringHeader是否是JSESSIONID,對(duì)于不同的WEB-SERVER,SESSIONID的獲得方式,可能會(huì)有不同。
if(result==0)//如果匹配,則把SESSIONID的字符串賦值給類的成員變量sessionId.
{
TPtrC16ptrSessionId=aHeaderData.Mid(pos2);
sessionId.Copy(ptrSessionId);
}
}
下面的代碼用來(lái)處理HTTP響應(yīng)的BODY信息。
voidCLotteryContainerView::ClientBodyReceivedL(CWebClientEngine&anEngine,constTDesC8&aBodyData)
{
TBuf<30>buf;
buf.Copy(aBodyData);
this->iLotteryContainer->GetLabel()->SetTextL(buf);//得到響應(yīng)BODY后,把彩票結(jié)果賦值給LABEL。
this->iLotteryContainer->DrawDeferred();//這里,通知container,進(jìn)行重繪操作。若不這樣,有時(shí)會(huì)得到結(jié)果了,LABEL上的值并沒(méi)有改變。