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)文章可咨詢客服老師,歡迎參考。

HTTP應(yīng)用學(xué)習(xí)有感

終于把自己練習(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)有改變。