版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章網(wǎng)絡(luò)編程9
9.1通過(guò)HTTP訪問(wèn)網(wǎng)絡(luò)9.2JSON數(shù)據(jù)9.3通過(guò)OkHttp訪問(wèn)網(wǎng)絡(luò)3HTTP協(xié)議重點(diǎn)了解掌握2JSON數(shù)據(jù)OkHttp訪問(wèn)網(wǎng)絡(luò)
1學(xué)習(xí)目標(biāo)第9章網(wǎng)絡(luò)編程9.1通過(guò)HTTP訪問(wèn)網(wǎng)絡(luò)9.2JSON數(shù)據(jù)9.3通過(guò)OkHttp訪問(wèn)網(wǎng)絡(luò)主講內(nèi)容Speechcontent主講內(nèi)容HTTP協(xié)議通信簡(jiǎn)介HTTP(HyperTextTransferProtocol)即超文本傳輸協(xié)議,它規(guī)定了瀏覽器和服務(wù)器之間相互通信的規(guī)則。HTTP協(xié)議是一種請(qǐng)求/響應(yīng)式的協(xié)議。當(dāng)客戶端與服務(wù)器端建立連接后,向服務(wù)器端發(fā)送的請(qǐng)求,稱作HTTP請(qǐng)求。當(dāng)服務(wù)器端接收到請(qǐng)求后會(huì)做出響應(yīng),稱為HTTP響應(yīng)。9.1.1HTTP協(xié)議通信簡(jiǎn)介HTTP協(xié)議通信簡(jiǎn)介HTTP三點(diǎn)注意事項(xiàng):HTTP是無(wú)連接HTTP是媒體獨(dú)立的HTTP是無(wú)狀態(tài)9.1.1HTTP協(xié)議通信簡(jiǎn)介發(fā)送HTTP請(qǐng)求訪問(wèn)百度網(wǎng)站HTTP響應(yīng)返回百度首頁(yè)
使用手機(jī)客戶端訪問(wèn)百度時(shí),會(huì)發(fā)送一個(gè)HTTP請(qǐng)求,當(dāng)服務(wù)器端接收到請(qǐng)求后,會(huì)做出響應(yīng)并將百度頁(yè)面(數(shù)據(jù))返回給客戶端瀏覽器,這個(gè)請(qǐng)求響應(yīng)的過(guò)程就是HTTP通信的過(guò)程。9.1.1HTTP協(xié)議通信簡(jiǎn)介URLurl=newURL("");HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);InputStreamis=conn.getInputStream();conn.disconnect();在URL的構(gòu)造方法中傳入要訪問(wèn)資源的路徑創(chuàng)建HttpURLConnection對(duì)象設(shè)置請(qǐng)求方式設(shè)置超時(shí)時(shí)間獲取服務(wù)器返回的輸入流關(guān)閉HTTP連接
注意:使用HttpURLConnection對(duì)象訪問(wèn)網(wǎng)絡(luò)時(shí),需要設(shè)置超時(shí)時(shí)間,防止連接被阻塞時(shí)無(wú)響應(yīng),影響用戶體驗(yàn)。9.1.2使用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)GET和POST請(qǐng)求GET方式是以實(shí)體的方式得到由請(qǐng)求URL所指向的資源信息,它向服務(wù)器提交的參數(shù)跟在請(qǐng)求URL后面。使用GET方式訪問(wèn)網(wǎng)絡(luò)URL的長(zhǎng)度一般要小于1K。POST方式向服務(wù)器發(fā)出請(qǐng)求時(shí)需要在請(qǐng)求后附加實(shí)體。它向服務(wù)器提交的參數(shù)在請(qǐng)求后的實(shí)體中,POST方式對(duì)URL的長(zhǎng)度是沒(méi)有限制的。采用POST方式提交數(shù)據(jù)時(shí),用戶在瀏覽器中看不到向服務(wù)器提交的請(qǐng)求參數(shù),因此POST方式要比GET方式相對(duì)安全。9.1.2使用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)Stringpath="00:8080/web/LoginServlet?username="+URLEncoder.encode("zhangsan")+"&password="+URLEncoder.encode("123");URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);intresponseCode=conn.getResponseCode();if(responseCode==200){InputStreamis=conn.getInputStream();}將用戶名和密碼拼在指定資源路徑后面,并對(duì)用戶名和密碼進(jìn)行編碼獲取到狀態(tài)碼狀態(tài)碼為200,表示訪問(wèn)成功獲取返回內(nèi)容的輸入流GET方式提交數(shù)據(jù)URLurl=newURL("00:8080/web/LoginServlet");HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("POST");Stringdata="username="+URLEncoder.encode("zhangsan")+"&password="+URLEncoder.encode("123");conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",data.length()+"");conn.setDoOutput(true);OutputStreamos=conn.getOutputStream();os.write(data.getBytes());intcode=conn.getResponseCode();if(code==200){InputStreamis=conn.getInputStream();}準(zhǔn)備數(shù)據(jù)并給參數(shù)進(jìn)行編碼設(shè)置請(qǐng)求頭數(shù)據(jù)提交方式以及提交數(shù)據(jù)的長(zhǎng)度,這里是以form表單的方式提交以流的形式將數(shù)據(jù)寫到服務(wù)器上POST方式提交數(shù)據(jù)注意事項(xiàng)
在實(shí)際開(kāi)發(fā)中,手機(jī)端與服務(wù)器端進(jìn)行交互的過(guò)程中,避免不了要提交中文到服務(wù)器,這時(shí)就會(huì)出現(xiàn)中文亂碼的情況。因此,無(wú)論是GET方式還是POST方式提交參數(shù)時(shí)都要對(duì)參數(shù)進(jìn)行編碼。需要注意的是,編碼方式必須與服務(wù)器解碼方式一致。同樣,在獲取服務(wù)器返回的中文字符時(shí),也需要用指定格式進(jìn)行解碼。GET和POST請(qǐng)求方式—注意事項(xiàng)9.1.3Handler消息機(jī)制主線程A(UI線程)子主線程BHandler對(duì)象ActivitysendMessagehandlerMessage9.1.3Handler消息機(jī)制Handler消息機(jī)制Handler是一種異步回調(diào)機(jī)制,主要負(fù)責(zé)與子線程進(jìn)行通信。Handler機(jī)制主要包括四個(gè)關(guān)鍵對(duì)象:Message:消息,它由MessageQueue統(tǒng)一列隊(duì),由Handler處理。Handler:處理者,主要負(fù)責(zé)Message的發(fā)送以及處理。MessageQueue:消息隊(duì)列,主要用來(lái)存放Handler發(fā)送過(guò)來(lái)的消息,并且按照先入先出的規(guī)則執(zhí)行。Looper:消息循環(huán),不斷的從MessageQueue中抽取Message并執(zhí)行。9.1.3Handler消息機(jī)制Message1nextnextnextMessageQueueHandleMessage()回調(diào)disptchMessage()方法發(fā)送新消息取出待處理的消息...Message2MessageNLooperHandler第9章網(wǎng)絡(luò)編程9.2JSON數(shù)據(jù)主講內(nèi)容Speechcontent主講內(nèi)容JSON數(shù)據(jù)特點(diǎn)JSON即JavaScriptObjectNotation(對(duì)象表示法),是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON是基于純文本的數(shù)據(jù)格式,它可以傳輸String、Number、Boolean類型的數(shù)據(jù),也可以傳輸數(shù)組,或者Object對(duì)象。JSON文件的擴(kuò)展名為.json。JSON分為JSON對(duì)象和JSON數(shù)組兩種數(shù)據(jù)結(jié)構(gòu)。9.2JSON數(shù)據(jù)對(duì)象結(jié)構(gòu)以“{”開(kāi)始,以“}”結(jié)束。中間部分由0個(gè)或多個(gè)以“,”分隔的key:value對(duì)構(gòu)成,注意關(guān)鍵字和值之間以“:”分隔。關(guān)鍵字key必須為String類型,值value可以是String、Number、Object、Array等數(shù)據(jù)類型。9.2JSON數(shù)據(jù)數(shù)組結(jié)構(gòu)以“[”開(kāi)始,以“]”結(jié)束。中間部分由0個(gè)或多個(gè)以“,”分隔的值的列表組成。值value可以是String、Number、Boolean、null等數(shù)據(jù)類型。9.2JSON數(shù)據(jù)對(duì)象包含對(duì)象{"name":"zhangsan","address":{ "city":"Beijing", "street":"Xisanqi", "postcode":100096}}對(duì)象包含數(shù)組{"name":"zhangsan","hobby":["籃球","羽毛球","游泳"]}注意:使用JSON存儲(chǔ)單個(gè)數(shù)據(jù)(如“abc”),一定使用數(shù)組結(jié)構(gòu),因?yàn)閷?duì)象結(jié)構(gòu)必須是由“key:value”的形式構(gòu)成。9.2JSON數(shù)據(jù)兩種解析方式org.jsonAndroidSDK中為開(kāi)發(fā)者提供的,通過(guò)使用JSONObject和JSONArray兩個(gè)類完成對(duì)JSON數(shù)據(jù)的解析。由Google公司提供的,在使用Gson庫(kù)之前,首先需要將gson.jar添加到項(xiàng)目中,然后才能調(diào)用其提供的方法。Gson9.2JSON數(shù)據(jù)解析JSON對(duì)象例如,要解析的JSON數(shù)據(jù)如下:使用JSONObject解析JSON對(duì)象:{"name":"zhangsan","age":27,"married":true}//json1一個(gè)json對(duì)象[{"name":"lisi","age":25},{"name":"Jason","age":20}]//json2一個(gè)json數(shù)組JSONObjectjsonObj=newJSONObject(json1);Stringname=jsonObj.optString("name");intage=jsonObj.optInt("age");booleanmarried=jsonObj.optBoolean("married");optXXX()方法在解析數(shù)據(jù)時(shí)比getXXX()方法更安全,如果對(duì)應(yīng)字段不存在,optXXX()方法會(huì)返回空值或者0,而getXXX()方法會(huì)拋出異常。9.2JSON數(shù)據(jù)解析JSON數(shù)組使用JSONArray解析JSON數(shù)組:JSONArrayjsonArray=newJSONArray(json2);for(inti=0;i<jsonArray.length();i++){JSONObjectjsonObj=jsonArray.getJSONObject(i);Stringname=jsonObj.optString("name");intage=jsonObj.optInt("age");}數(shù)組的解析方法和對(duì)象類似,只是將key值替換為數(shù)組中的下標(biāo)。9.2JSON數(shù)據(jù)解析JSON例如,要解析的JSON數(shù)據(jù)如下(與org.json解析數(shù)據(jù)相同):使用Gson庫(kù)前,首先需要將gson.jar添加到項(xiàng)目中,并且創(chuàng)建JSON數(shù)據(jù)對(duì)應(yīng)的實(shí)體類Person1與Person2,需要注意的是,實(shí)體類中的成員名稱要與JSON數(shù)據(jù)中的key值一致。{"name":"zhangsan","age":27,"married":true}//json1一個(gè)json對(duì)象[{"name":"lisi","age":25},{"name":"Jason","age":20}]//json2一個(gè)json數(shù)組9.2JSON數(shù)據(jù)解析JSON使用Gson解析JSON對(duì)象使用Gson解析JSON數(shù)組Gsongson=newGson();Personperson1=gson.fromJson(json1,Person1.class);Gsongson=newGson();TypelistType=newTypeToken<List<Person2>>(){}.getType();List<Person2>person2=gson.fromJson(json2,listType);將JSON數(shù)據(jù)轉(zhuǎn)換成對(duì)象TypeToken是Google提供的一個(gè)解析JSON數(shù)據(jù)的類9.2JSON數(shù)據(jù)Get異步請(qǐng)求9.3通過(guò)OkHttp訪問(wèn)網(wǎng)絡(luò)OkHttpClientokHttpClient=newOkHttpClient();Requestrequest=newRequest.Builder().url("/data/sk/101220101.html").build();okHttpClient.newCall(request).enqueue(newCallback(){@OverridepublicvoidonFailure(Callcall,IOExceptione){//失敗回調(diào)
}@OverridepublicvoidonResponse(Callcall,finalResponseresponse)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年餐飲行業(yè)預(yù)制菜品標(biāo)準(zhǔn)化采購(gòu)合同樣本3篇
- 2024版家政服務(wù)詳細(xì)合同3篇
- 2025年度門衛(wèi)車輛通行管理與收費(fèi)合同
- 2025年度木工班組勞務(wù)承包與綠色施工合同
- 2025年度土方回填工程合同風(fēng)險(xiǎn)評(píng)估與控制
- 2025年度新能源儲(chǔ)能技術(shù)投資合作合同
- 酒店承包合同范本
- 2025年度填充墻砌筑工程竣工驗(yàn)收與結(jié)算合同
- 茶葉購(gòu)銷合同范本模板
- 北京租房合同樣板
- 2024年安徽省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 山西省太原市重點(diǎn)中學(xué)2025屆物理高一第一學(xué)期期末統(tǒng)考試題含解析
- 充電樁項(xiàng)目運(yùn)營(yíng)方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(kù)(附含答案)
- 高考對(duì)聯(lián)題(對(duì)聯(lián)知識(shí)、高考真題及答案、對(duì)應(yīng)練習(xí)題)
- 新版《鐵道概論》考試復(fù)習(xí)試題庫(kù)(含答案)
- 【律師承辦案件費(fèi)用清單】(計(jì)時(shí)收費(fèi))模板
- 高中物理競(jìng)賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- Unit1FestivalsandCelebrations詞匯清單高中英語(yǔ)人教版
- 2024年上海市中考語(yǔ)文試題卷(含答案)
- 幼兒園美術(shù)教育研究策略國(guó)內(nèi)外
評(píng)論
0/150
提交評(píng)論