前言
okhttp这一个网络通信框架是我第二个学习的网络框架,很多公司也喜欢使用这一个框架,我们公司也使用,所以呢,学习这一套框架是很必要的,因为它可以实现大部分的网络请求,如普通的GET,POST请求,上传,下载,加载图片等..让我们一起来学习吧!!
1.okhttp介绍
okhttp是一个轻量级的框架,由移动支付公司Square公司贡献,目的是用于替代HttpURLConnection和HttpClient
- okhttp特点
1.允许连接到同一个主机地址的所有请求,提高请求效率
2.共享socket,减少对服务器的请求
3.通过连接池,减少延迟
4.缓存网络数据
5.更少流量消耗
6.Gzip压缩自动处理
- okhttp功能
1.GET,POST请求
2.文件的上传和下载
3.加载图片(自动压缩)
4.请求回调,支持对象和对象集合
5.session保持
- okhttp要求
Android2.3及以上,java最低要求1.7
2.okhttp使用
1.添加依赖或者包
AndroidStudio下添加到gradle
compile 'com.squareup.okhttp3:okhttp:3.9.0'
Eclipse下添加包
/**
*
* @param url 请求地址
*/
public void okHttp_Get_String(String url){
//构造一个okhttpclient对象
OkHttpClient client=new OkHttpClient();
//创建请求,传入访问地址
Request request=new Request.Builder()
.url(url)
.build();
// 通过okhttpclient对象访问这个请求,返回回应
// 方式一,同步,该方法需要放进线程进行请求
// try {
// okhttp3.Response response=client.newCall(request).execute();
// Log.d("result",response.body().string());
// // TODO: 2017/9/8 success
// } catch (IOException e) {//这里可能io异常
// TODO: 2017/9/8 error
// e.printStackTrace();
// }
//方式二,异步,直接调到线程中执行
Call call=client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, IOException e) {
// TODO: 2017/9/8 error not UI Thread
e.printStackTrace();
}
@Override
public void onResponse(@NonNull Call call, @NonNull okhttp3.Response response) throws IOException {
// TODO: 2017/9/8 success not UI Thread
//response.body().string()获取字符串String
//response.body().bytes()获取二进制数组byte[]主要用于图片
//response.body().byteStream()获取输入流InputStream//主要下载文件
String result=response.body().string();
Log.d("result",result);
}
});
}
3.普通的Post请求
1.创建表单body构建器,传入需要post的key和value值,再设置到request请求中
FormBody.Builder fbBody=new FormBody.Builder();
for (Map.Entry<String,String> entry:params.entrySet()){
fbBody.add(entry.getKey(),entry.getValue());
}
//创建请求,传入访问地址
Request request=new Request.Builder()
.url(url)
.post(fbBody.build())
.build();
2.完整的一个post方法
/**
*
* @param url 请求地址
* @param params 请求参数
*/
public String okHttp_Post_String(String url,Map<String,String> params){
OkHttpClient client=new OkHttpClient();
//创建表单构建器
FormBody.Builder fbBody=new FormBody.Builder();
//添加key和value进表单
for (Map.Entry<String,String> entry:params.entrySet()){
fbBody.add(entry.getKey(),entry.getValue());
}
//post添加
Request request=new Request.Builder()
.url(url)
.post(fbBody.build())
.build();
try {
okhttp3.Response response=client.newCall(request).execute();
return response.body().string();
// TODO: 2017/9/8 success
} catch (IOException e) {//这里可能io异常
TODO: 2017/9/8 error
e.printStackTrace();
}
return null;
}
4.上传文件
/**
* 上传文件和表单提交
* @param url 请求地址
* @param params 请求参数
* @param files 文件列表
*/
public String okHttp_PostFile_String(String url, Map<String,String> params, List<File> files){
OkHttpClient client=new OkHttpClient();
//
MultipartBody.Builder muliBuilder=new MultipartBody.Builder();
//添加表单数据
for (Map.Entry<String,String> entry: params.entrySet()){
muliBuilder.addFormDataPart(entry.getKey(),entry.getValue());
}
//添加上传文件列表
if (files!=null){
for (File file:files){
RequestBody fileBody=RequestBody.create(null,file);
muliBuilder.addFormDataPart("date",file.getName(),fileBody);
}
}
Request request=new Request.Builder()
.url(url)
.post(muliBuilder.build())
.build();
try {
okhttp3.Response response=client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}