OkHttp是一個處理網(wǎng)絡請求的開源項目,一個網(wǎng)絡請求框架赋荆。
優(yōu)點:
1.支持http請求笋妥,https請求。
2.支持文件下載窄潭、加載圖片春宣。
3.支持get,post請求嫉你。
4.基于Http的文件上傳月帝。
缺點:
1.callback回來是在子線程里面, 不能刷新UI,需要我們手動處理幽污。
2.封裝比較麻煩嚷辅。
使用方式:
1.添加依賴
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
2 請求
2.1.get請求
1.同步get請求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
//默認get請求 可以省略
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
因為是同步方式(耗時操作) 不要在主線程執(zhí)行耗時操作 改進代碼:
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
//默認get請求 可以省略
Request request = new Request.Builder().url(url).get().build();
Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
2.異步get請求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
//默認get請求,可以省略
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
call.execute 同步方式
call.enqueue 異步方式
2.2 post請求
get把參數(shù)包含在url中距误,post通過request body傳遞參數(shù)
在構造Request對象時潦蝇,需要多構造一個RequestBody對象,用它來攜帶我們要提交的數(shù)據(jù).
構造 RequestBody 需要指定MediaType,用于描述請求/響應 body 的內容類型
1.RequestBody--json數(shù)據(jù)提交
//MediaType 設置Content-Type 標頭中包含的媒體類型值
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String json="****";//json字符串數(shù)據(jù)
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(JSON,json))
.build();
2.FormBody--表單數(shù)據(jù)提交
FormBody formBody = new FormBody.Builder()
.add("id", "001")
.add("name", "張三")
.build();
Request request=new Request.Builder().url(netUrl).post(formBody).build();
3.MultipartBody--文件上傳
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
//上傳文件
public void uoloadFile(String localPath){
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
File file = new File(localPath);
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(mediaType, file))
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
}