Android網路連接和網路資料處理
- HTTP請求方式GET與POST
- Android網路請求
- OkHttp
- 添加OKHttp庫的依賴
- 宣告網路權限
- 簡單布局
- OkHttp具體用法
- 同步、異步概念
- 同步
- 異步
- 異步方法示例
- 資料決議
- 概念
- 實踐
- GsonFormat插件的安裝
HTTP請求方式GET與POST
在Android開發中我們會接觸到資料的互動,比如寫入資料、讀取資料等,因此我們需要使用通訊間的協議來進行請求,最常見的協議是HTTP協議,而GET和POST則是HTTP協議中最常用的兩種請求方式,
- HTTP協議
HTTP(HyperText Transfer Protocol超文本傳輸協議)是一個設計來使客戶端和服務器順利進行通訊的協議,
HTTP在客戶端和服務器之間以request-response protocol(請求-回復協議)作業, - GET和POST的區別
| GET | POST |
|---|---|
| 一般是從服務器上獲取資料 | 一般用來上傳表單到服務器1 |
| URL 可見,安全性低 | URL 不可見,安全性高 |
| 提交的資料有長度限制 | 提交的資料無長度限制 |
| 資料可快取 | 資料不可快取 |
| 通過拼接URL進行引數傳遞 | 資料放在請求體中發送 |
現在一般使用安全性較高的POST進行請求,在發送密碼或其他敏感資訊時一定不能使用 GET,POST 比 GET 更安全,因為引數不會被保存在瀏覽器歷史或 web 服務器日志中,GET的資料在 URL 中對所有人都是可見的,
Android網路請求
Android進行網路請求有三種方法:HttpURLConnection、 HttpClient以及OkHttp,
HttpClient由于存在API數量過多、擴展困難等缺點,在Android6.0系統中,該功能已經被正式棄用,而原生的HttpURLConnection是JDK里提供的聯網API,但是由于網路操作涉及到異步以及多執行緒,自己使用原生API撰寫比較麻煩,所以實際開發更偏向于直接使用第三方網路通信庫,而我們今天要介紹的OkHttp就屬于眾多網路通信庫中做的最出色的一個,
OkHttp
添加OKHttp庫的依賴
compile 'com.squareup.okhttp3:okhttp:3.6.0'
宣告網路權限
<uses-permission android:name="android.permission.INTERNET"/>
如果使用了不安全的http鏈接,應該在在清單檔案中宣告:
android:usesCleartextTraffic="true"
簡單布局
<Button
android:id="@+id/btn_request"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="請求資料"/>
<Button
android:id="@+id/btn_jump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳轉決議頁"/>
<TextView
android:id="@+id/tv_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
OkHttp具體用法
- 定義并實體化一個OkHttpClient
OkHttpClient client = new OkHttpClient();
- 創建一個Request物件以發起一條HTTP請求,并通過url()方法來設定目標的網路地址,
Request request = new Request.Builder()
.url("http://106.53.96.124/wanted/public/index.php/index/article/find")
.build();
- 呼叫OkHttpClient的newCall()方法創建一個Call物件,并呼叫execute()方法發送請求并獲取回應資料,
- 定義一個response物件來接識訓取到的回應資料,并通過responseData來取得我們回傳的具體內容,
Response response = client.newCall(request).execute();
String responseData = response.body().string();
- 由于網路請求屬于耗時操作,應該在子執行緒中執行,因此我們在設定點擊事件時,在onClick()方法中我們應該新開一個子執行緒,示例如下:
btn_request.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
sendRequestWithOkHttp();//該方法封裝了以上1-4步的內容
}
}).start();
}
});
- sendRequestWithOkHttp()方法具體內容如下:
private void sendRequestWithOkHttp(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://106.53.96.124/wanted/public/index.php/index/article/find")
.build();
//try catch進行例外捕捉
try {
//同步寫法
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//由于我們進行網路請求是在子執行緒執行,因此獲取到的資料需要從子執行緒傳遞到主執行緒的Ui界面才能顯示
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_data.setText(responseData);
}
});
}catch (Exception e){
e.printStackTrace();
}
}
同步、異步概念
同步
同步方法呼叫一旦開始,呼叫者必須等到方法呼叫回傳后,才能繼續后續的行為,當前主執行緒會阻塞,直到子執行緒通知主執行緒為止,
(提交請求 → 等待服務器處理 → 處理完畢回傳)
異步
異步方法呼叫通常會在另外一個執行緒中繼續執行,整個程序,不會阻礙呼叫者的作業,主執行緒可以繼續干其它的事情,當子執行緒完成任務的時候通知一下主執行緒就可以了,類似于介面回呼或訊息佇列的思想,
(請求通過事件觸發>服務器處理(無需等待,主執行緒可以做別的事)>處理完畢)
兩者比較更推薦使用異步方法進行網路請求,
異步方法示例
定義一個Call物件,并把把request傳給call,通過call呼叫.enqueue()方法執行,需要給enqueue()方法傳一個Callback介面的匿名實作類(包含了onFailure()和onRresponse()方法),
以下是異步監聽方法示例:
private void sendRequestWithOkHttp(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://106.53.96.124/wanted/public/index.php/index/article/find")
.build();
//異步監聽寫法
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String jsonData = response.body().string();
// 傳遞到主執行緒UI界面
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_data.setText(jsonData);
}
});
}
});
}
資料決議
概念
一般來說通過網路請求獲取到的資料有很多種,xml格式資料、Json格式資料等,我們以上通過網路請求獲取到的資料就是Json格式資料,
比如
{"name":"alex","age":"18","friends":[{"name":"Amy","age":"19"},{"name":"Jack","age":"18"}]}
以上{}中相當于是一個類的實體,[{},{}]相當于是一個有兩個類組成的陣列,包括了兩個類的實體,
實踐
- 添加Gson庫的依賴
implementation 'com.google.code.gson:gson:2.7'
- 新建一個BaseResponse< T >基類來接收我們從服務端獲取到的資料,類的內容可以通過Gsonformat插件匯入,alt+s喚出插件界面,復制我們的json格式資料,點擊OK,
- 創建一個parseJSONWithGSON()方法
private void parseJSONWithGSON(){
Gson gson = new Gson();
//由于我們這里需要決議的Json資料中包含了陣列,所以需要使用TypeToken將期望決議成資料型別傳入到fromJson()方法中
BaseResponse<List<BaseResponse.Article>> baseResponse = gson.fromJson(jsonData,new TypeToken<BaseResponse<List<BaseResponse.Article>>>(){}.getType());
List<BaseResponse.Article> articleList = baseResponse.getData();
Log.d("code", "code is " + baseResponse.getCode());
Log.d("msg", "msg is " + baseResponse.getMsg());
for (BaseResponse.Article article:articleList){
Log.d("Data", "id is "+article.getId());
Log.d("Data", "title is "+article.getTitle());
Log.d("Data", "content is "+article.getContent());
Log.d("Data", "tags is "+article.getTags());
Log.d("Data", "create_time is "+article.getCreate_time());
Log.d("Data", "writer is "+article.getWriter());
Log.d("Data", "images is "+article.getImages());
Log.d("Data", "photo is "+article.getPhoto());
Log.d("Data", "like_number is "+article.getLike_number());
Log.d("Data", "comment_number is "+article.getComment_number());
}
}
- 在點擊事件OnClick()方法中,呼叫parseJSONWithGSON()方法,
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (jsonData==null){
Toast.makeText(MainActivity.this,"資料為空",Toast.LENGTH_SHORT).show();
}
else parseJSONWithGSON();
}
});
GsonFormat插件的安裝
File→setting→plugin→Marketplace,搜索gsonformat/Sgsonformat/gsonfromatplus,通過alt+insert喚出gsonformat插件,復制json格式資料點擊ok,
介面測驗:https://getman.cn/
介面檔案:http://www.docway.net/
參考資料:
Android入門之Http請求方式Get與Post
同步和異步的區別
同步(Synchronous)和異步(Asynchronous)
一般用來上傳表單(資料集合)到服務器,服務器處理后再回傳資料給客戶端, ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/277695.html
標籤:其他
