AppWorker教程-網(wǎng)絡(luò)傳輸

網(wǎng)絡(luò)傳輸(Http)

注意:官方推出了類(lèi)似ajax的封裝js庫(kù),如果對(duì)ajax熟悉,可以直接使用,下載地址
do_Http組件就是實(shí)現(xiàn)http/https協(xié)議的組件.

首先要說(shuō)明一下,AppWorker平臺(tái)只是一個(gè)移動(dòng)端開(kāi)發(fā)的平臺(tái),不涉及任何后臺(tái)服務(wù)端的技術(shù),你可以使用你自己任何熟悉的語(yǔ)言和技術(shù)來(lái)實(shí)現(xiàn)服務(wù)端,do_Http組件就是用來(lái)和服務(wù)端通信。
http是一個(gè)最基礎(chǔ)的應(yīng)用層的通信協(xié)議,開(kāi)發(fā)者應(yīng)該很熟悉,但是在QQ群和很多同學(xué)討論,發(fā)現(xiàn)有不少人沒(méi)有很好的理解http。我這里再簡(jiǎn)單描述一下,熟悉的人就跳過(guò)吧。

協(xié)議的介紹

所謂協(xié)議就是指http的客戶端和服務(wù)端的一個(gè)協(xié)商的一個(gè)標(biāo)準(zhǔn),一個(gè)規(guī)范,是一個(gè)可以用文字來(lái)描述能用紙來(lái)記錄下來(lái)的文檔。

比如說(shuō)假設(shè)一個(gè)規(guī)范規(guī)定

 客戶端發(fā)送“hi”給服務(wù)端,服務(wù)端必須回答“hi client"
 客戶端發(fā)送“hello”給服務(wù)端,服務(wù)端必須回答“hello hello”
 ......

那么不管你客戶端是用Java還是什么語(yǔ)言,服務(wù)端是用C#還是別的語(yǔ)言,都必須按照這個(gè)規(guī)范,都必須客戶端發(fā)hi,服務(wù)端返回hi client。

當(dāng)然http協(xié)議要復(fù)雜很多,詳細(xì)的可以參考http協(xié)議的介紹。常用的語(yǔ)言比如Java,C#,ios等等都有這個(gè)協(xié)議的實(shí)現(xiàn),do_Http也一樣。這些語(yǔ)言實(shí)現(xiàn)的方式各有不同,有不同名字的屬性,事件,方法,但是本質(zhì)上都是實(shí)現(xiàn)這套規(guī)范。

HTTP通信的過(guò)程

  • 客戶端利用一些屬性事件方法,拼接出一個(gè)請(qǐng)求報(bào)文。這個(gè)報(bào)文是有一定格式的,而且這個(gè)格式必須正確。報(bào)文通常分報(bào)文header和報(bào)文body。它的大概格式類(lèi)似如下例子:
POST /sn/index HTTP/1.1
Accept: */*
Accept-Language: zh-cn
host: localhost

Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close

sn=123&n=asa
  • do_Http組件提供了一些屬性和方法來(lái)拼接這個(gè)請(qǐng)求報(bào)文:

body :post的數(shù)據(jù)
contentType:post的數(shù)據(jù)格式
method:數(shù)據(jù)請(qǐng)求的方法,基本的是GET,POST,也支持DELETE,PUT等標(biāo)準(zhǔn)
timeout:毫秒為單位的超時(shí)設(shè)置
url:請(qǐng)求的地址
setRequestHeader():設(shè)置header里的屬性和屬性值,可以執(zhí)行多次,每次增加一條

  • 客戶端把報(bào)文發(fā)送到服務(wù)端,do_Http組件提供了4個(gè)方法來(lái)處理,本質(zhì)上這4個(gè)方法都是一樣,只不過(guò)為了方便,分成了4個(gè)應(yīng)用不同的場(chǎng)景。

request():最基本的請(qǐng)求方法,通常只能發(fā)送文本
download():可以直接發(fā)送一個(gè)請(qǐng)求把服務(wù)端的文件下載下來(lái)保存到手機(jī)端,可以監(jiān)控下載的進(jìn)度。
upload():可以把本地的文件上傳到服務(wù)端,可以監(jiān)控上傳的進(jìn)度。
form():有點(diǎn)類(lèi)似request和upload的混合,它可以同時(shí)發(fā)送多個(gè)文本也能發(fā)送多個(gè)文件。類(lèi)似 web的表單提交。

  • 服務(wù)端接受到客戶端發(fā)送過(guò)來(lái)的請(qǐng)求報(bào)文,然后解析成數(shù)據(jù)。這一塊和do平臺(tái)無(wú)關(guān),可以用你自己熟悉的后臺(tái)開(kāi)發(fā)語(yǔ)言來(lái)實(shí)現(xiàn)。

  • 服務(wù)端對(duì)請(qǐng)求作出相應(yīng)處理之后,返回一個(gè) 響應(yīng)報(bào)文給前端,這個(gè)報(bào)文也是有格式的,報(bào)文通常分報(bào)文header和報(bào)文body。類(lèi)似下面的格式:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>W(wǎng)rox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

這個(gè)步驟也和do平臺(tái)無(wú)關(guān)。

  • 客戶端接收服務(wù)端返回的響應(yīng)報(bào)文做相應(yīng)的處理。
    do_Http提供4個(gè)接口來(lái)處理返回的數(shù)據(jù)

fail:請(qǐng)求出錯(cuò)事件
progress:發(fā)送和接受數(shù)據(jù)時(shí)可以用這個(gè)監(jiān)控進(jìn)度
result:發(fā)送后接受完數(shù)據(jù)會(huì)觸發(fā)這個(gè)事件
success:只有接受到狀態(tài)碼200才會(huì)觸發(fā)這個(gè)事件,這個(gè)事件不夠完善,還是用result事件更合適

完整的測(cè)試示例

1.客戶端:分別實(shí)現(xiàn)get,post,upload,form,download的http請(qǐng)求。本質(zhì)上其實(shí)就2種get和post。do_http還支持put,delete等,這里沒(méi)有演示。

為了看到請(qǐng)求的報(bào)文,服務(wù)端會(huì)把請(qǐng)求的報(bào)文作為響應(yīng)的報(bào)文數(shù)據(jù)一部分返回到客戶端。需要輸入你自己搭建的服務(wù)端的IP地址和端口。


image

2. 服務(wù)端利用java的servlet來(lái)模擬一個(gè)服務(wù)端,使用的jetty容器,可以不用安裝tomcat服務(wù),直接當(dāng)成一個(gè)應(yīng)用可以運(yùn)行。就是作為大家做服務(wù)端的參考和調(diào)試用。源代碼在GIT。服務(wù)端啟動(dòng)一個(gè)8080端口的web服務(wù)。

詳細(xì)的示例參考這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容