網(wǎng)絡(luò)傳輸(Http)
注意:官方推出了類似ajax的封裝js庫饭豹,如果對(duì)ajax熟悉剩拢,可以直接使用,下載地址
do_Http組件就是實(shí)現(xiàn)http/https協(xié)議的組件.
首先要說明一下,AppWorker平臺(tái)只是一個(gè)移動(dòng)端開發(fā)的平臺(tái),不涉及任何后臺(tái)服務(wù)端的技術(shù),你可以使用你自己任何熟悉的語言和技術(shù)來實(shí)現(xiàn)服務(wù)端脐雪,do_Http組件就是用來和服務(wù)端通信厌小。
http是一個(gè)最基礎(chǔ)的應(yīng)用層的通信協(xié)議,開發(fā)者應(yīng)該很熟悉战秋,但是在QQ群和很多同學(xué)討論璧亚,發(fā)現(xiàn)有不少人沒有很好的理解http。我這里再簡單描述一下脂信,熟悉的人就跳過吧癣蟋。
協(xié)議的介紹
所謂協(xié)議
就是指http的客戶端和服務(wù)端的一個(gè)協(xié)商的一個(gè)標(biāo)準(zhǔn),一個(gè)規(guī)范狰闪,是一個(gè)可以用文字來描述能用紙來記錄下來的文檔疯搅。
比如說假設(shè)一個(gè)規(guī)范規(guī)定
客戶端發(fā)送“hi”給服務(wù)端,服務(wù)端必須回答“hi client"
客戶端發(fā)送“hello”給服務(wù)端埋泵,服務(wù)端必須回答“hello hello”
......
那么不管你客戶端是用Java還是什么語言幔欧,服務(wù)端是用C#還是別的語言,都必須按照這個(gè)規(guī)范丽声,都必須客戶端發(fā)hi
礁蔗,服務(wù)端返回hi client
。
當(dāng)然http協(xié)議要復(fù)雜很多雁社,詳細(xì)的可以參考http協(xié)議的介紹浴井。常用的語言比如Java,C#霉撵,ios等等都有這個(gè)協(xié)議的實(shí)現(xiàn)磺浙,do_Http也一樣洪囤。這些語言實(shí)現(xiàn)的方式各有不同,有不同名字的屬性屠缭,事件箍鼓,方法,但是本質(zhì)上都是實(shí)現(xiàn)這套規(guī)范呵曹。
HTTP通信的過程
- 客戶端利用一些屬性事件方法款咖,拼接出一個(gè)請(qǐng)求報(bào)文。這個(gè)報(bào)文是有一定格式的奄喂,而且這個(gè)格式必須正確铐殃。報(bào)文通常分報(bào)文header和報(bào)文body。它的大概格式類似如下例子:
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組件提供了一些屬性和方法來拼接這個(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è)方法來處理民假,本質(zhì)上這4個(gè)方法都是一樣,只不過為了方便龙优,分成了4個(gè)應(yīng)用不同的場(chǎng)景羊异。
request():最基本的請(qǐng)求方法,通常只能發(fā)送文本
download():可以直接發(fā)送一個(gè)請(qǐng)求把服務(wù)端的文件下載下來保存到手機(jī)端彤断,可以監(jiān)控下載的進(jìn)度野舶。
upload():可以把本地的文件上傳到服務(wù)端,可以監(jiān)控上傳的進(jìn)度宰衙。
form():有點(diǎn)類似request和upload的混合平道,它可以同時(shí)發(fā)送多個(gè)文本也能發(fā)送多個(gè)文件。類似 web的表單提交供炼。
服務(wù)端接受到客戶端發(fā)送過來的請(qǐng)求報(bào)文巢掺,然后解析成數(shù)據(jù)。這一塊和do平臺(tái)無關(guān)劲蜻,可以用你自己熟悉的后臺(tái)開發(fā)語言來實(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。類似下面的格式:
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)無關(guān)。
- 客戶端接收服務(wù)端返回的響應(yīng)報(bào)文做相應(yīng)的處理含懊。
do_Http提供4個(gè)接口來處理返回的數(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等茁影,這里沒有演示宙帝。
為了看到請(qǐng)求的報(bào)文,服務(wù)端會(huì)把請(qǐng)求的報(bào)文作為響應(yīng)的報(bào)文數(shù)據(jù)一部分返回到客戶端募闲。需要輸入你自己搭建的服務(wù)端的IP地址和端口步脓。
2. 服務(wù)端利用java的servlet來模擬一個(gè)服務(wù)端,使用的jetty容器浩螺,可以不用安裝tomcat服務(wù)靴患,直接當(dāng)成一個(gè)應(yīng)用可以運(yùn)行。就是作為大家做服務(wù)端的參考和調(diào)試用要出。源代碼在GIT鸳君。服務(wù)端啟動(dòng)一個(gè)8080端口的web服務(wù)。
詳細(xì)的示例參考這里