OkHttp3简介
1.支持http和https协议,api相同,易用;
2.http使用线程池,https使用多路复用;
3.okhttp支持同步和异步调用;
4.支持普通form和文件上传form;
5.操作请求和响应(日志,请求头,body等);
6.okhttp可以设置缓存;
7.支持透明的gzip压缩响应体
OkHttp3 配置
1.Android Studio 配置gradle:
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
2,添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
OkHttp3 使用思路
get请求思路
1.获取okHttpClient对象
2.构建Request对象
3.构建Call对象
4.通过Call.enqueue(callback)方法来提交异步请求;execute()方法实现同步请求
post请求思路
1.获取okHttpClient对象
2.创建RequestBody
3.构建Request对象
4.构建Call对象
5.通过Call.enqueue(callback)方法来提交异步请求;execute()方法实现同步请求
GET请求
发送异步请求
//第一步获取okHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.build();
//第二步构建Request对象
Request request = new Request.Builder()
.url(url)
.get()
.build();
//第三步构建Call对象
Call call = client.newCall(request);
//第四步:异步get请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("onFailure", e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.i("result", result);
}
});
发送同步请求
//第一步获取okHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.build();
//第二步构建Request对象
Request request = new Request.Builder()
.url(url)
.get()
.build();
//第三步构建Call对象
final Call call = client.newCall(request);
//第四步:同步get请求
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();//必须子线程执行
String result = response.body().string();
Log.i("response", result);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
OkHttp3 发送异步请求(POST)
//接口参数 String username,String password
String url = "http://";
//第一步创建OKHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.build();
//第二步创建RequestBody(Form表达)
RequestBody body = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
//第三步创建Rquest
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
//第四步创建call回调对象
final Call call = client.newCall(request);
//第五步发起请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("onFailure", e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.i("result", result);
}
});
OkHttp3 发送同步请求(POST)
//接口参数 String username,String password
String url = "http://";
//第一步创建OKHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.build();
//第二步创建RequestBody
RequestBody body = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
//第三步创建Rquest
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
//第四步创建call回调对象
final Call call = client.newCall(request);
//第五步发起请求
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
String result = response.body().string();
Log.i("response", result);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
请求头处理(Header)以及超时和缓冲处理以及响应处理
//超时设置
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5,TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.writeTimeout(5,TimeUnit.SECONDS)
.cache(new Cache(cacheDirectory,10*1024*1024))
.build();
//表单提交
RequestBody requestBody = new FormBody.Builder()
.add("pno", "1")
.add("ps","50")
.add("dtype","son")
.add("key","4a7cf244fd7efbd17ecbf0cb8e4d1c85")
.build();
//请求头设置
Request request = new Request.Builder()
.url(url)
.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
.header("User-Agent", "OkHttp Example")
.post(body)
.build();
//响应处理
@Override
public void onResponse(Call call, Response response) throws IOException {
//响应行
Log.d("ok", response.protocol() + " " +response.code() + " " + response.message());
//响应头
Headers headers = response.headers();
for (int i = 0; i < headers.size(); i++) {
Log.d("ok", headers.name(i) + ":" + headers.value(i));
}
//响应体
final String string = response.body().string();
Log.d("ok", "onResponse: " + string);
runOnUiThread(new Runnable() {
@Override
public void run() {
tx.setText(string);
}
});
}
请求体处理(Form表单,String字符串,流,文件)
//1.POST方式提交String/JSON application/json;json串
MediaType mediaType1 = MediaType.parse("application/x-www-form-urlencoded;charset=utf-8");
String requestBody = "pno=1&ps=50&dtype=son&key=4a7cf244fd7efbd17ecbf0cb8e4d1c85";
RequestBody requestBody1 = RequestBody.create(mediaType1, requestBody);
//POST方式提交JSON:传递JSON同时设置son类型头
RequestBody requestBodyJson = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), "{}");
request.addHeader("Content-Type", "application/json")//必须加json类型头
//POST方式提交无参
RequestBody requestBody1 = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=utf-8"), "");
//2.POST方式提交流
RequestBody requestBody2 = new RequestBody() {
@Nullable
@Override
public MediaType contentType() {
return MediaType.parse("application/x-www-form-urlencoded;charset=utf-8");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8("pno=1&ps=50&dtype=son&key=4a7cf244fd7efbd17ecbf0cb8e4d1c85");
}
};
//3.POST方式提交表单
RequestBody requestBody4 = new FormBody.Builder()
.add("pno", "1")
.add("ps","50")
.add("dtype","son")
.add("key","4a7cf244fd7efbd17ecbf0cb8e4d1c85")
.build();
//4.POST提交文件
MediaType mediaType3 = MediaType.parse("text/x-markdown; charset=utf-8");
File file = new File("test.txt");
RequestBody requestBody3 = RequestBody.create(mediaType3, file);
//5.POST方式提交分块请求
MultipartBody body = new MultipartBody.Builder("AaB03x")
.setType(MultipartBody.FORM)
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"title\""),
RequestBody.create(null, "Square Logo"))
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"image\""),
RequestBody.create(MediaType.parse("image/png"), new File("website/static/logo-square.png")))
.build();