項(xiàng)目2任務(wù)4-HTTP請(qǐng)求與響應(yīng)_第1頁(yè)
項(xiàng)目2任務(wù)4-HTTP請(qǐng)求與響應(yīng)_第2頁(yè)
項(xiàng)目2任務(wù)4-HTTP請(qǐng)求與響應(yīng)_第3頁(yè)
項(xiàng)目2任務(wù)4-HTTP請(qǐng)求與響應(yīng)_第4頁(yè)
項(xiàng)目2任務(wù)4-HTTP請(qǐng)求與響應(yīng)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)HTTP請(qǐng)求與響應(yīng)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)在任務(wù)4中,我們將學(xué)習(xí)OkHttp框架,在APP中創(chuàng)建HTTP客戶端,通過(guò)GET、POST以及同步、異步方式向服務(wù)器發(fā)送HTTP請(qǐng)求,接收到HTTP響應(yīng)后將相應(yīng)的數(shù)據(jù)部分取出處理。有些Web服務(wù)器提供了API接口,HTTP客戶端只要按照約定向Web服務(wù)器發(fā)送HTTP請(qǐng)求,就會(huì)獲取期望的返回?cái)?shù)據(jù)。任務(wù)引入HTTP全稱為HyperTextTransferProtocol,即超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用最廣泛的一種網(wǎng)絡(luò)協(xié)議。與瀏覽器Web應(yīng)用一樣,開發(fā)物聯(lián)網(wǎng)APP時(shí),一部分?jǐn)?shù)據(jù)也需要通過(guò)HTTP請(qǐng)求向服務(wù)器獲取。那么在AndroidStudio中有沒(méi)有簡(jiǎn)便的方法進(jìn)行HTTP的請(qǐng)求與響應(yīng)呢?二、相關(guān)知識(shí)HTTP協(xié)議HTTP是一種可擴(kuò)展的協(xié)議,是一種應(yīng)用層協(xié)議,是運(yùn)行在TCP之上的。因?yàn)榫哂辛己玫臄U(kuò)展性,所以HTTP協(xié)議不僅被用來(lái)傳輸超文本文檔,還被用來(lái)傳輸圖片或視頻以及提交HTML表單等信息。用戶通過(guò)瀏覽器輸入url提交請(qǐng)求,就是使用的HTTP協(xié)議。HTTP的使用比較簡(jiǎn)單,HTTP報(bào)文允許簡(jiǎn)單測(cè)試,容易讀懂,開發(fā)門檻較低。OkHttp框架OkHttp是Android開發(fā)的最常用的網(wǎng)絡(luò)請(qǐng)求框架,由Square公司開源。OkHttp可以理解為是一個(gè)HTTP層面的框架,它的工作原理簡(jiǎn)單來(lái)說(shuō)就是:(1)首先利用socket建立與服務(wù)器的TCP連接;(2)然后將符合HTTP協(xié)議的請(qǐng)求報(bào)文拼接好并傳遞到服務(wù)器;(3)最后讀取服務(wù)器的響應(yīng)。除了基本的HTTP使用,OkHttp還提供了線程池,以此來(lái)執(zhí)行異步請(qǐng)求。二、相關(guān)知識(shí)相關(guān)鏈接OkHttp框架使用流程如圖2-25所示:(1)通過(guò)newOkHttpClient()創(chuàng)建HTTP客戶端對(duì)象;(2)通過(guò)Request.Builder創(chuàng)建Request請(qǐng)求對(duì)象(用于請(qǐng)求包);(3)通過(guò)調(diào)用HTTP客戶端對(duì)象的newCall方法,傳入Request對(duì)象,生成Call對(duì)象(用于發(fā)送請(qǐng)求);(4)由Call對(duì)象調(diào)用execute或enqueue方法提交請(qǐng)求,得到響應(yīng)Response。注意,如圖2-25所示,同步請(qǐng)求和異步請(qǐng)求的前三步一樣,包括創(chuàng)建HTTP客戶端對(duì)象、創(chuàng)建Request請(qǐng)求包、創(chuàng)建發(fā)送請(qǐng)求Call對(duì)象。但第四步不同:如果同步請(qǐng)求Call對(duì)象調(diào)用execute()方法,則直接請(qǐng)求;如果異步請(qǐng)求Call對(duì)象調(diào)用enqueue()方法,則將請(qǐng)求加入隊(duì)列中。圖2-25OkHttp框架使用流程OkHttp使用流程OKHttp官網(wǎng):https://square.github.io/okhttp/。二、相關(guān)知識(shí)GET請(qǐng)求方法OkHttp官網(wǎng)提供了GET請(qǐng)求方法的示例,代碼如下:OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl)throwsIOException{Requestrequest=newRequest.Builder().url(url).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的GET方法中:(1)通過(guò)newOkHttpClient()創(chuàng)建了HTTP客戶端對(duì)象client;(2)創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置要直接訪問(wèn)的url(參數(shù)包含在url中,即GET方法);(3)調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。二、相關(guān)知識(shí)POST請(qǐng)求方法OkHttp官網(wǎng)提供了POST請(qǐng)求方法的示例,代碼如下:publicstaticfinalMediaTypeJSON=MediaType.get("application/json;charset=utf-8");OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl,Stringjson)throwsIOException{Requestrequest=newRequest.Builder().url(url).post(body).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的POST方法中:(1)通過(guò)newOkHttpClient()創(chuàng)建了HTTP客戶端對(duì)象client;(2)將參數(shù)放在RequestBody類對(duì)象中,后面通過(guò)POST方法提交;(3)創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置url,并調(diào)用POST方法設(shè)置要提交的一些參數(shù)(即POST方法);(4)調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。二、相關(guān)知識(shí)在HTTP請(qǐng)求方法中,有哪些組合形式?課堂討論三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī)。實(shí)施過(guò)程1.創(chuàng)建工程及配置(1)添加框架。如圖2-26所示,新建Android工程“OKHttpClient”,在app→build.gradle中添加viewBinding框架:圖2-26添加viewBinding和OkHttp框架android.buildFeatures.viewBinding=true添加OkHttp框架:mplementationc'om.squareup.okhttp3:okhttp:5.0.0-alpha.10'點(diǎn)擊同步。三、任務(wù)實(shí)施(2)編寫HTTP請(qǐng)求的配置文件。如圖2-27所示,在res的xml文件夾,新建network_security_config.xml文件,代碼如下:<?xmlversion="1.0"encoding="utf-8"?><network-security-config><base-configcleartextTrafficPermitted="true"/></network-security-config>圖2-27編寫HTTP請(qǐng)求的配置文件Android系統(tǒng)限制了HTTP協(xié)議明文流量的網(wǎng)絡(luò)請(qǐng)求,對(duì)HTTPS是沒(méi)有影響的。本任務(wù)中會(huì)使用到HTTP,所以需要編寫網(wǎng)絡(luò)安全配置文件,將cleartextTrafficPermitted設(shè)置為“true”。三、任務(wù)實(shí)施(3)添加網(wǎng)絡(luò)權(quán)限。如圖2-28所示,允許程序打開網(wǎng)絡(luò)套接字:<uses-permissionandroid:name="android.permission.INTERNET"/>圖2-28添加網(wǎng)絡(luò)權(quán)限然后通過(guò)networkSecurityConfig配置,開啟非加密的HTTP網(wǎng)絡(luò)請(qǐng)求(也可以不要):android:networkSecurityConfig="@xml/文件名"三、任務(wù)實(shí)施2.頁(yè)面布局設(shè)計(jì)activity_main.xml布局文件的代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“測(cè)試同步請(qǐng)求“/><TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content"/>三、任務(wù)實(shí)施在布局文件中,設(shè)計(jì)了2個(gè)按鈕(用于測(cè)試同步和異步請(qǐng)求)和2個(gè)文本框(用于顯示響應(yīng)值)。兩個(gè)按鈕控件的id分別是btn1和btn2,兩個(gè)文本框控件的id分別textView1和textView2。<Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“測(cè)試異步請(qǐng)求“/><TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>三、任務(wù)實(shí)施3.活動(dòng)文件設(shè)計(jì)(1)創(chuàng)建對(duì)象。如圖2-29所示,在MainActivity.java活動(dòng)文件中,創(chuàng)建了一個(gè)ActivityMain-Binding對(duì)象binding和一個(gè)HTTP客戶端對(duì)象okHttpClient。okHttpClient對(duì)象通過(guò)OkHttpClient.Builder()構(gòu)造,并調(diào)用build方法實(shí)例化。圖2-29MainActivity活動(dòng)中創(chuàng)建對(duì)象三、任務(wù)實(shí)施(2)兩個(gè)按鈕的單擊事件監(jiān)聽。代碼如下:binding.btn1.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testGet_s(); }});binding.btn2.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testPost_as(); }});在btn1的單擊事件監(jiān)聽里面,調(diào)用了同步請(qǐng)求函數(shù)testGet_s。在btn2的單擊事件監(jiān)聽里面,調(diào)用了異步請(qǐng)求函數(shù)testPost_as。所謂同步請(qǐng)求,就是直接請(qǐng)求;所謂異步請(qǐng)求,就是把請(qǐng)求加入enqueue(隊(duì)列)中,等待執(zhí)行。下面分別編寫這兩個(gè)同步請(qǐng)求函數(shù)和異步請(qǐng)求函數(shù):在同步請(qǐng)求函數(shù)中用GET方法,在異步請(qǐng)求函數(shù)中用POST方法。當(dāng)然這個(gè)也根據(jù)自己的需要選擇。三、任務(wù)實(shí)施(3)btn1的同步請(qǐng)求函數(shù)testGet_s。代碼如下://同步請(qǐng)求函數(shù)

privatevoidtestGet_s(){

//創(chuàng)建請(qǐng)求對(duì)象

Requestrequest=newRequest.Builder()

.url("/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d")

.build();

//開啟子線程,因操作耗時(shí)不能在主線程中執(zhí)行

newThread(newRunnable(){

@Override

publicvoidrun(){

try{

//創(chuàng)建響應(yīng)對(duì)象,客戶端的newCall就是發(fā)起請(qǐng)求的方法,execute是直接執(zhí)行即同步請(qǐng)求,返回即是響應(yīng)

Responseresponse=okHttpClient.newCall(request).execute();

//獲取響應(yīng)的數(shù)據(jù)部分

Stringresult=response.body().string();

//在主線程更新UI,即在textView1文本框中顯示三、任務(wù)實(shí)施

//在主線程更新UI,即在textView1文本框中顯示

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

binding.textView1.setText(result);

}

});

}catch(IOExceptione){

e.printStackTrace();

}

}

}).start();

}在testGet_s函數(shù)中:①創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置要直接訪問(wèn)的url(參數(shù)包含在url中,即GET方法);②HTTP客戶端調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。三、任務(wù)實(shí)施注意:因?yàn)镠TTP網(wǎng)絡(luò)請(qǐng)求耗時(shí),所以需要開啟子線程,在子線程中發(fā)起請(qǐng)求;當(dāng)獲取到響應(yīng)的數(shù)據(jù)部分后,需要開啟UI線程,在UI線程中更新UI;因?yàn)榭赡艹霈F(xiàn)的異常情況,程序中進(jìn)行了異常的捕獲和處理。還要注意在btn1的單擊事件監(jiān)聽中,需要調(diào)用testGet_s同步請(qǐng)求函數(shù)。單擊測(cè)試同步請(qǐng)求按鈕,在APP中測(cè)試,可以成功獲取到返回的天氣情況,并展示出來(lái),如圖2-30所示,圖中還展示了通過(guò)瀏覽器查詢的結(jié)果。圖2-30在APP中測(cè)試同步請(qǐng)求三、任務(wù)實(shí)施登錄/,使用和風(fēng)天氣API,注冊(cè)后可獲得自己的key,然后給出要查詢城市的Location_ID即可如:/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d其中的101010100是北京的Location_ID。相關(guān)鏈接Devapi參考文檔:/docs/api/weather/weather-now/。三、任務(wù)實(shí)施(4)btn2的異步請(qǐng)求函數(shù)testPost_as。//異步請(qǐng)求函數(shù),/get.php,apipost工具

privatevoidtestPost_as(){

//創(chuàng)建表單

FormBodyformBody=newFormBody.Builder()

.add("username","1")

.build();

//將表單數(shù)據(jù)放入request中,通過(guò)post方法提交

Requestrequest=newRequest.Builder()

.url("/get.php")

.post(formBody)

.build();

//將客戶端請(qǐng)求加入到隊(duì)列中,會(huì)自動(dòng)在子線程中運(yùn)行。返回有2種情況,失敗或者有響應(yīng)

okHttpClient.newCall(request).enqueue(newCallback(){

@Override

publicvoidonFailure(@NonNullCallcall,@NonNullIOExceptione){

e.printStackTrace();

}

@Override在異步方式下,不再需要主動(dòng)創(chuàng)建子線程,只需要把創(chuàng)建的請(qǐng)求加入隊(duì)列中即可。testPost_as函數(shù)代碼如下:三、任務(wù)實(shí)施@Override

publicvoidonResponse(@NonNullCallcall,@NonNullResponseresponse)throwsIOException{

//獲取響應(yīng)的數(shù)據(jù)部分

Stringresult=response.body().string();

//在主線程更新UI,即在textView2文本框中顯示

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

binding.textView2.setText(result);

}

});

}

});

}函數(shù)中創(chuàng)建了一個(gè)表單,將表單數(shù)據(jù)放入request中,通過(guò)POST方法提交。將客戶端請(qǐng)求加入隊(duì)列中,會(huì)自動(dòng)在子線程中運(yùn)行。返回有2種情況:失敗或者有響應(yīng)。如果有響應(yīng),則獲取響應(yīng)的數(shù)據(jù)部分,在主線程更新UI,即在textView2文本框中顯示。三、任務(wù)實(shí)施注意在btn2的單擊事件監(jiān)聽中,調(diào)用testPost_as異步請(qǐng)求函數(shù)。單擊測(cè)試btn2異步請(qǐng)求按鈕,在APP中測(cè)試異步請(qǐng)求,如圖2-31所示。圖2-31在APP中測(cè)試異步請(qǐng)求測(cè)試發(fā)現(xiàn),可以成功返回?cái)?shù)據(jù)并展示出來(lái)。相關(guān)鏈接pipost工具:/get.php。三、任務(wù)實(shí)施(5)解決瀏覽器亂碼問(wèn)題。有的瀏覽器(HTTP客戶端)在HTTP請(qǐng)求返回的消息中出現(xiàn)亂碼,是字符編碼的問(wèn)題,可以按以下步驟處理。以Google瀏覽器為例,首先解壓瀏覽器擴(kuò)展程序,如圖2-32所示。圖2-32解壓瀏覽器擴(kuò)展程序圖2-33加載已解壓的擴(kuò)展程序然后加載已解壓的擴(kuò)展程序,如圖2-33所示。點(diǎn)擊Chrome瀏覽器地址欄右側(cè)的擴(kuò)展程序圖標(biāo),選擇Charset右側(cè)的圖釘,可以將其固定在地址欄右側(cè),以方便后續(xù)使用。三、任務(wù)實(shí)施最后,當(dāng)請(qǐng)求返回?cái)?shù)據(jù)亂碼時(shí),點(diǎn)擊Charset圖標(biāo),選擇UTF-8,即可重新發(fā)送請(qǐng)求加載頁(yè)面,請(qǐng)求回來(lái)的數(shù)據(jù)中文不再顯示成亂碼

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論