一、OkHttp简介
OkHttp是一个安卓平台和Java的HTTP客户端,用于向Web服务器发送和接收数据。它非常适合处理大量的网络数据流和Web服务。OkHttp使用清晰度很高的API进行简化,并且使用方便。
是当前使用最广泛的网络请求库之一,Retrofit就是基于OkHttp封装完成的
二、OkHttp的主要功能
1. 自动处理常见的协议,如HTTP 1.1, SPDY和HTTP/2。
2. 连接池技术: OkHttp可以跨请求自动重用HTTP和SPDY连接。它通过连接池技术来减少网络延迟。连接池还能节省您的电池
3. 请求压缩传输: OkHttp支持Gzip压缩传输,它可以减少数据传输量从而减少网速慢时的等待时间
4. 能够处理故障:OkHttp尝试合理地处理故障,比如无法访问的地址,超时,以及空输出流等。
5. 支持通过HTML表单进行POST数据提交
三、OkHttp的使用
1.引入OkHttp依赖
在项目的build.gradle
文件的dependencies属性下添加OkHttp的依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.7'
2.创建OkHttpClient对象
在调用网络请求之前,需要先创建一个OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
如果需要设置一些参数,则可以在创建OkHttpClient对象时进行设置。比如超时时间、设置请求头等,例如:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.addInterceptor(new UserAgentInterceptor("Mozilla/5.0 (Windows NT 10.0; WOW64)"))
.build();
3.创建Request对象
使用OkHttp发送请求,需要先构建一个Request对象,包含url,头部信息、请求类型和请求体等。最常用的是GET和POST请求, 分别使用Request.Builder对应的方法创建Request对象
例如创建一个GET请求:
Request request = new Request.Builder()
.url("http://www.example.com")
.build();
创建一个POST请求:
RequestBody requestBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
Request request = new Request.Builder()
.url("http://www.example.com/login")
.post(requestBody)
.build();
4.发送请求
最后,我们使用前面创建好的OkHttpClient和Request对象来调用网络请求。这个网络请求一般是异步的,并且返回回调结果。然后我们在回调结果里面完成具体的业务操作。
例如:
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 异常回调
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 成功回调
String result = response.body().string();
}
});
四、OkHttp的小技巧
1.设置Https证书
当访问的是https链接时,可能需要设置证书进行认证。例如:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
try {
InputStream is = getAssets().open("xxx.cer");
SSLSocketFactory sslSocketFactory = new HttpsUtils.SSLParams(null, is, null).getSSLFactory();
builder.sslSocketFactory(sslSocketFactory);
} catch (IOException e) {
e.printStackTrace();
}
okHttpClient = builder.build();
2.添加请求头
有时候需要在请求头里面添加一些特定的参数,例如用户认证信息等。可以用addHeader()方法:
Request request = new Request.Builder()
.url("http://www.example.com")
.addHeader("Authorization", "Bearer " + token)
.build();
3.取消请求
当网络较差时,网络请求可能会被阻塞或延迟返回结果。在一些情况下,可以考虑取消请求,比如用户重新发起请求。
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 异常回调
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 成功回调
String result = response.body().string();
}
});
// 取消请求
call.cancel();
4.设置超时时间
设置请求超时时间可以避免由网络问题造成的超时等待,可以使用OkHttpClient.Builder的connectTimeout()、readTimeout()和writeTimeout()方法分别设置连接超时、读取超时和写入超时时间,例如:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
5.自定义拦截器
使用拦截器可以拦截并处理所有的请求和响应
例如实现一个自定义的UserAgentInterceptor,用于在请求头中添加User-Agent字段,可以识别不同的客户端类型:
public class UserAgentInterceptor implements Interceptor {
private String userAgent;
public UserAgentInterceptor(String userAgent) {
this.userAgent = userAgent;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("User-Agent", userAgent)
.build();
return chain.proceed(request);
}
}
这样使用以下代码就可以在请求头中自动添加"User-Agent"字段了:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new UserAgentInterceptor("Mozilla/5.0 (Windows NT 10.0; WOW64)"))
.build();
五、总结
本文简单介绍了OkHttp的主要功能和使用方法,以及一些小技巧。OkHttp作为安卓平台和Java的HTTP客户端,其使用简单、功能强大,可以快速的进行网络请求。因此,大家可以放心使用OkHttp来获取网络数据,提高应用的用户体验。