




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)客戶(hù)端與服務(wù)器端建立連接后,向服務(wù)器端發(fā)送的請(qǐng)求,稱(chēng)作HTTP請(qǐng)求。當(dāng)服務(wù)器端接收到請(qǐng)求后會(huì)做出響應(yīng),稱(chē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ī)客戶(hù)端訪問(wèn)百度時(shí),會(huì)發(fā)送一個(gè)HTTP請(qǐng)求,當(dāng)服務(wù)器端接收到請(qǐng)求后,會(huì)做出響應(yīng)并將百度頁(yè)面(數(shù)據(jù))返回給客戶(hù)端瀏覽器,這個(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),影響用戶(hù)體驗(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í),用戶(hù)在瀏覽器中看不到向服務(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();}將用戶(hù)名和密碼拼在指定資源路徑后面,并對(duì)用戶(hù)名和密碼進(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ù)寫(xiě)到服務(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類(lèi)型的數(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類(lèi)型,值value可以是String、Number、Object、Array等數(shù)據(jù)類(lèi)型。9.2JSON數(shù)據(jù)數(shù)組結(jié)構(gòu)以“[”開(kāi)始,以“]”結(jié)束。中間部分由0個(gè)或多個(gè)以“,”分隔的值的列表組成。值value可以是String、Number、Boolean、null等數(shù)據(jù)類(lèi)型。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è)類(lèi)完成對(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ì)象類(lèi)似,只是將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í)體類(lèi)Person1與Person2,需要注意的是,實(shí)體類(lèi)中的成員名稱(chēng)要與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ù)的類(lèi)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)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年麻風(fēng)二聯(lián)苗項(xiàng)目發(fā)展計(jì)劃
- 2025年醫(yī)藥研發(fā)服務(wù)外包項(xiàng)目發(fā)展計(jì)劃
- 顱骨修補(bǔ)術(shù)中醫(yī)護(hù)理課件
- 申報(bào)書(shū)課題方案范文
- 冠名捐贈(zèng)合同范例
- 臺(tái)牌制作合同范本
- 商用合法租房合同范本
- 咖啡館合同范本
- 和單位臨時(shí)合同范例
- 產(chǎn)權(quán)房轉(zhuǎn)讓合同范本
- 2024年“新能源汽車(chē)裝調(diào)工”技能及理論知識(shí)考試題與答案
- 【地理】非洲-位置與范圍 高原為主的地形課件-2024-2025學(xué)年湘教版(2024)七下
- 搶救車(chē)的管理
- GB/T 44927-2024知識(shí)管理體系要求
- GB/T 17350-2024專(zhuān)用汽車(chē)和專(zhuān)用掛車(chē)分類(lèi)、名稱(chēng)及型號(hào)編制方法
- 2025山東青島市屬事業(yè)單位公開(kāi)招聘筆試和高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年07月山東省泰山財(cái)產(chǎn)保險(xiǎn)股份有限公司2024年夏季校園招考29名工作人員筆試歷年參考題庫(kù)附帶答案詳解
- 臨床護(hù)理死亡病例討論
- 2025年廣東韶關(guān)城投集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 醫(yī)療器械生產(chǎn)企業(yè)并購(gòu)合同
- 2025版新能源汽車(chē)充電站建設(shè)合同含政府補(bǔ)貼及稅收優(yōu)惠條款
評(píng)論
0/150
提交評(píng)論