OkHttp(一)
1 简介
OkHttp是现今一个较为出众的网络通信库,可以替代原生的HTTPURLConnection,支持Http/SPDY,有着简单易用,拓展性好等优点。
2 HttpURLConnection
让我们先看看未使用OkHttp要怎样实现网络请求。
在未使用框架前,我们基本上会使用原生的HttpClient(已淘汰)和HttpURLConnection来进行发送HTTP请求。
HttpURLConnection是一种多用途、轻量级的HTTP客户端,我们大部分的应用程序可以使用它来进行HTTP操作。接下来简单使用其来发送一个Get方法的Http请求。
注意以下操作都是在子线程下进行的
- (1)获取HttpURLConnection的实例
// 用URL对象来创建HttpURLConnection
URL murl = new URL("https://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection)murl.openConnection;
// 设置参数(超时时间,读取超时,请求方法,header等
connection.setConnectionTimeout(8888);
connection.setRequestMethod("GET");
...
// POST请求还要将参数写入到输出流中
- (2)连接并获取输入流,并对其处理
connection.connect();
mInputSteam = connection.getInputSteam();
// 可选
int code = mHttpURLConnection.getResponseCode();
String respose = converStreamToString(mInputStream);
Log.i("baidu", "请求状态码:" + code + "\n请求结果:\n" + respose);`
//根据实际情况,来判断如何处理流数据
mInputSteam.close();
- (3)关闭连接
connection.disconnect();
以上就是HttpURLConnection的一个基本操作。
3 OkHttp的使用
3.1 Get请求
//建造者模式构建对象
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.get()
.url("https://www.4399.com")
.build();
Call call = client.newCall(request);
try {
//1.同步请求调用的方法是call.execute(),内部采用的是线程阻塞(一直等待直到线程返回结果)方式直接将结果返回到Response
Response response = call.execute();
//2.异步请求调用的方法是call.enqueue(Callback callback),该方法需要传入一个Callback等待结果回调的接口
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.w("cozing", "请求失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//在这里处理得到的Response
Log.w("cozing", "请求成功");
}
});
} catch (IOException e) {
e.printStackTrace();
}
3.2 Post请求
OkHttpClient client = new OkHttpClient();
// 将参数构造成表单对象
FormBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "admin")
.build();
Request request = new Request.Builder()
.post(formBody)
.url("https://www.4399.com")
.build();
Call call = client.newCall(request);
try {
Response response = call.execute();
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.w("cozing", "请求失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//在这里处理得到的Response
Log.w("cozing", "请求成功");
}
});
} catch (IOException e) {
e.printStackTrace();
}
以上就是OkHttp的一个基本使用,我们不难看出由于其对网络请求功能进行了封装,使得整体的代码变得更加的简洁明了。
4 OkHttp的基础类(接口)介绍
从上面的代码中,还出现了几个类,如OkHttpClient,Call, Request类等,这些暴露出来的类,涉及到我们的使用,所以接下来让我们看看这些类。
OkHttpClient
OkHttp的使用从这个类的构建开始,Client是客户端的意思,所以个人认为这个类的本质就是对使用OkHttp的客户端进行一个专门的定制。
构建举例
new OkhttpClient.Builder()
.addInterceptor(loggingIntecepter)
.retryOnConnectionFailure(true)
.connectionTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.build();
OkHttpClient的构建利用了建造者模式,该模式的常用于复杂对象的构建,将构建的细节封装,具体的说明以后再说。
在该对象的构建中,我们看到了添加拦截器和连接重试等,查看源码中OkHttpClient属性可知,大部分与拦截器相关的设置都在这个对象中设置。
Request
从英语译文中可以看出,这是和请求相关的一个类,包含了请求URL等属性。我们需要这个类,来定义我们访问的类。
构建举例
Request request = new Request.BUilder()
.url(url)
.build();
上述例子中,也是使用了建造者模式,其中只用了一个url属性,此外还有这method(GET和POST之类),headers(请求头),requestBody(请求体)和tag。
Call
该接口是实际请求网络的接口,其实现类是RealCall,其构建方式是简单工厂模式(传入一个参数,放回一个该参数对应的对象)
其源码如下:
interface Factory {
Call newCall(Request request);
}
...
@Override
public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}
构建方式从上面可以推导而出。
client.newCall(request) //用上了之前的两个类。
该接口及其实现类是OkHttp的一个核心内容,其有着很多东西值得去探究,下一节仔细来分析这篇文章。
5 小结
在这篇文章中,我们首先简要介绍了如何利用HttpURLConnection来进行网络请求,而后介绍了OkHttp的简单使用和在使用过程中碰到一些类。
我们算是对OkHttp有了一个小小的入门,下一节开始深入的解析OkHttp的一个执行流程。