項目2任務4-HTTP請求與響應_第1頁
項目2任務4-HTTP請求與響應_第2頁
項目2任務4-HTTP請求與響應_第3頁
項目2任務4-HTTP請求與響應_第4頁
項目2任務4-HTTP請求與響應_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

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

privatevoidtestGet_s(){

//創(chuàng)建請求對象

Requestrequest=newRequest.Builder()

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

.build();

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

newThread(newRunnable(){

@Override

publicvoidrun(){

try{

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

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

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

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

//在主線程更新UI,即在textView1文本框中顯示三、任務實施

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

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

binding.textView1.setText(result);

}

});

}catch(IOExceptione){

e.printStackTrace();

}

}

}).start();

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

privatevoidtestPost_as(){

//創(chuàng)建表單

FormBodyformBody=newFormBody.Builder()

.add("username","1")

.build();

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

Requestrequest=newRequest.Builder()

.url("/get.php")

.post(formBody)

.build();

//將客戶端請求加入到隊列中,會自動在子線程中運行。返回有2種情況,失敗或者有響應

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

@Override

publicvoidonFailure(@NonNullCallcall,@NonNullIOExceptione){

e.printStackTrace();

}

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

publicvoidonResponse(@NonNullCallcall,@NonNullResponseresponse)throwsIOException{

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

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

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

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

binding.textView2.setText(result);

}

});

}

});

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論