OkHttp是一个处理网络请求的开源项目,一个网络请求框架。
优点:
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();
}
因为是同步方式(耗时操作) 不要在主线程执行耗时操作 改进代码:
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把参数包含在url中,post通过request body传递参数
在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据.
构造 RequestBody 需要指定MediaType,用于描述请求/响应 body 的内容类型
1.RequestBody--json数据提交
//MediaType 设置Content-Type 标头中包含的媒体类型值
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String json="****";//json字符串数据
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(JSON,json))
.build();
2.FormBody--表单数据提交
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());
}
});
}