各位老铁们好,相信很多人对高效网络请求攻略:掌握OkHttp3的简易运用技巧都不是特别的了解,因此呢,今天就来为大家分享下关于高效网络请求攻略:掌握OkHttp3的简易运用技巧以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
如果要使用OkHttp,需要导入OkHttp的第三方依赖:
实现"com.squareup.okhttp3:okhttp:3.10.0"
注意:如果您的Android Studio低于3.0,则需要将“实现”更改为“编译”。
导入依赖之后,我们就可以开始使用OkHttp了。
1)我们需要创建OKHttpClient对象,OkHttpClient对象有2种方式创建:
1: 通过new关键字直接创建
OkHttpClient okHttpClient=new OkHttpClient();
2: 通过builder模式创建OkHttpClient的内部类Builder对象获取OKHttpClient
OkHttpClient okHttpClient=new OkHttpClient.Builder().build();
我们经常使用第二种方法来创建OkHttpClient对象。拦截器对象可以添加到OkHttpClient对象中,并且在构建器模式中创建OkHttpClient对象的代码看起来非常整洁。
添加拦截器对象:
添加应用拦截器对象addInterceptor(Interceptor拦截器),添加网络拦截器对象addNetworkInterceptor(Interceptor拦截器),这个拦截器对象后面会讲到。
2)创建Request对象
这里我们不能直接通过new创建Request对象。因为Request的构造函数不是public的,所以我们可以通过创建Request的内部类对象来获取Request。
请求request=new Request.Builder().build();
创建Request对象时,可以配置url地址、请求方法、请求头。
配置url地址:
请求request=new Request.Builder().url(String url).build();
与其他配置方法一样,只需键入“.”即可。直接在Builder() 之后调用它。我直接把方法贴出来。
设置请求方式:
1.获取请求
get() //Request.Builder方法
get请求不需要设置。默认是get请求。您无需手动设置请求方法。
2. 发布请求
post(RequestBody requestBody)//Request.Builder方法
RequestBody 这个类是一个接口,我们通常传入它的子类FormBody。
创建一个FormBody 对象。与Request一样,该类的构造函数不是公共的。通过创建FormBody的内部类对象来获取FormBody。
FormBody formBody=new FormBody.Builder().build();
post请求一般都有参数。如果post请求没有参数,我们可以直接作为get请求来请求就可以了。那么post请求的参数在哪里添加呢?通过add(String name, String value)在FormBody中添加参数信息。
添加请求头:
addHeader(String name,String value)//Request.Builder方法
3)通过OkHttpClient对象发起请求
通过OkHttpClient的newCall(Requset request)方法返回Call对象。 Call对象是网络请求的真正执行者。
调用call=okHttpClient.newCall(request);
请求方式有2种:
1:同步请求
发出同步请求后,线程将进入阻塞状态,等待请求完成后继续执行。但在Android中我们不能阻塞UI线程,它是主线程。如果主线程被阻塞,程序会直接挂掉。这就是我们常说的ANR异常。所有使用同步请求时,都必须开启子线程来请求数据。
请求request=new Request.Builder()
//设置url地址
.url(url).build();
//获取调用对象
调用call=okHttpClient.newCall(request);
尝试{
//发送同步请求
响应response=call.execute();
//将结果转为字符串
字符串responseStr=response.body().string();
}catch (IOException e) {
e.printStackTrace();
}
2:异步请求
发出异步请求后,OkHttp会在内部开启一个线程来请求数据。数据请求完成后,将通过接口回调存储数据。主线程不会阻塞,但是以后的相关操作必须在数据回来时写入。
请求request=new Request.Builder()
//设置url地址
.url(url).build();
//获取调用对象
调用call=okHttpClient.newCall(request);
//发送异步请求
call.enqueue(new Callback() {
/*
这个内部类的方法都在子线程中。如果需要更新UI,则必须在线程之间切换。
*/
/**
* 监控失败的请求
* @参数调用
* @param e 失败错误信息
*/
@覆盖
公共无效onFailure(调用调用,最终IOException e){
//切换回主线程循环执行
runOnUiThread(new Runnable() {
@覆盖
公共无效运行(){
Toast.makeText(MainActivity.this,"错误消息:" +e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 监听请求成功
* @参数调用
* @param 响应请求结果
* @抛出IOException
*/
@覆盖
public void onResponse(调用调用,响应响应)抛出IOException {
//获取请求体对象
响应体responseBody=response.body();
//将请求结果转为字符串
最终字符串responseStr=responseBody.string();
/*
拿到数据后,Gson解析数据
*/
//切换回主线程循环执行
runOnUiThread(new Runnable() {
@覆盖
公共无效运行(){
Toast.makeText(MainActivity.this,"请求结果:" +responseStr, Toast.LENGTH_SHORT).show();
}
});
}
});
此时就可以使用OkHttp来发出一些简单的网络请求了。
下面说说给Okhttp配置拦截器:
有时我们需要添加响应头信息并拦截响应头。在我们实际的开发过程中,后台的联调也是通过拦截器来进行的。为什么拦截器很重要以及如何使用它?
拦截器有两种类型
1.应用拦截器
addInterceptor(Interceptor拦截器) //OkHttpClient.Builder方法
应用程序拦截器也称为日志拦截器。您可以自己手动编写应用拦截器,也可以导入并依赖Okhttp提供的应用拦截器。
1).手动编写拦截器
//创建拦截器对象
拦截器拦截器=new Interceptor() {
@覆盖
公共响应拦截(链链)抛出IOException {
//获取请求对象
请求request=chain.request();
//获取响应对象
响应response=chain.proceed(request);
//获取所有响应头
标头headers=response.headers();
//方便所有响应头
设置名称=headers.names();
for (字符串名称: 个名称) {
Log.d("OkHttpUtils", name + ":" + headers.get(name));
}
//一定要返回原来的response对象,不要使用new。否则无法请求数据
返回响应;
}
};
2).导入依赖实现拦截器
实现"com.squareup.okhttp3:logging-interceptor:3.5.0"
//创建拦截器对象
HttpLoggingInterceptor拦截器=new HttpLoggingInterceptor(HttpLoggingInterceptor.Logger.DEFAULT);
//设置打印信息。 HEADERS 是响应头,BODY 是响应正文,NONE 不打印。 BASIC是基本信息(响应头和响应体)。
Interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
2.网络拦截器
addNetworkInterceptor(Interceptor拦截器) //OkHttpClient.Builder方法
网络拦截器通常用于添加响应头和拦截响应头,例如设置缓存。网络拦截器只能手动编写,并且没有可导入的依赖项。
拦截器拦截器=new Interceptor() {
@覆盖
公共响应拦截(链链)抛出IOException {
//获取请求对象
请求request=chain.request();
//获取响应对象
响应response=chain.proceed(request);
//通过原始Response对象获取Response.Builder
Response.Builder responseBuilder=response.newBuilder();
//添加响应头
响应新响应=responseBuilder
.addHeader("键","值")
.addHeader("key2","value2").build();
//返回新获得的Response对象
返回新响应;
}
};
最后说说设置缓存
我们发出的网络请求通常会缓存数据。这将节省用户流量。
cache(Cache cache) //OkHttpClient.Builder方法
缓存分为两种情况:
1).后台服务器支持缓存
如果后端服务器支持缓存(响应头中有"Cache-Control"字段),则直接设置存储地址和文件大小即可。
//创建Cache对象App.context.getCacheDir() 获取app的dir目录文件大小
缓存缓存=new Cache(App.context.getCacheDir(),1024 *1024 *10);
2).后台服务器不支持缓存
如果后端服务器不支持缓存(响应头中没有“Cache-Control”字段)。需要拦截响应头,手动添加"Cache-Control"字段,并设置存储地址和文件大小。
1.手动添加"Cache-Control"字段
拦截器拦截器=new 拦截器() {
@覆盖
公共响应拦截(链链)抛出IOException {
//获取请求对象
请求request=chain.request();
//获取响应对象
响应response=chain.proceed(request);
//通过原始Response对象获取Response.Builder
Response.Builder responseBuilder=response.newBuilder();
//添加响应头
响应新响应=responseBuilder
//添加Cache-Control字段以支持缓存
.addHeader("Cache-Control","max-age=" +60 *60 *12)
。建造();
//返回新获得的Response对象
返回新响应;
}
};
2. 设置存储地址和文件大小。
//创建Cache对象App.context.getCacheDir() 获取app的dir目录文件大小
高效网络请求攻略:掌握OkHttp3的简易运用技巧的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、高效网络请求攻略:掌握OkHttp3的简易运用技巧的信息别忘了在本站进行查找哦。
【高效网络请求攻略:掌握OkHttp3的简易运用技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学习一下OkHttp3的使用,这篇文章应该能帮到我吧!
有14位网友表示赞同!
最近在做项目用到网络请求,看到OkHttp3挺热门的,来试试看。
有13位网友表示赞同!
终于找到一篇简单的OkHttp3讲解了,希望能上手得更快!
有20位网友表示赞同!
对于初学者来说,这样深入浅出的解释还是挺好的,理解性强。
有15位网友表示赞同!
以前用的HttpClient,现在听说OkHttp3性能更佳,要学习一下新技能啦!
有5位网友表示赞同!
网络请求这块一直没太明白,希望能通过这篇文章加深了解。
有17位网友表示赞同!
看标题就觉得这篇文章很实用的,直接上手操作就好。
有5位网友表示赞同!
准备开始Android开发了,OkHttp3应该是必备的工具吧!
有16位网友表示赞同!
文章讲解清晰易懂,代码示例也很实用,好评!
有15位网友表示赞同!
OkHttp3的使用范围挺广泛的,可以用来做很多网络请求场景。
有16位网友表示赞同!
之前没接触过OkHttp3,感觉这篇文章是一篇很好的入门教程。
有10位网友表示赞同!
这篇文字带我点通了不少网络请求的知识点,原来是这样操作的!
有11位网友表示赞同!
学习OkHttp3的小技巧,可以让我在开发中更有效率!
有5位网友表示赞同!
想用OkHttp3来实现自定义的网络请求接口,这篇文章可以参考一下。
有6位网友表示赞同!
分享给一起学习的朋友吧,这个学习资料很实用的!
有11位网友表示赞同!
看完文章之后感觉OkHttp3操作还是挺容易上手的。
有8位网友表示赞同!
希望以后写一些更深入的技术讲解,对OkHttp3的功能实现有一个更深层次的理解。
有16位网友表示赞同!
网络请求这块经常会遇到问题,学习OkHttp3可以解决很多麻烦!
有9位网友表示赞同!
如果文章后面能提供更多的使用案例,那就更好了!
有12位网友表示赞同!