在开发中大部分请求都是Get请求,比如:列表的数据展示,详情界面的现实,用户头像的现实等他们都是Get请求,顾名思义就是获取到某个地址的信息。下面来看看Okhttp中是怎么支持Get请求的呢?
同步Get请求
比如我们获取到我的博客主页,我的博客主页是:http://me.woblog.cn。可以这样来写:
//这里创建OkHttpClient,建议一个应用只有一个
final OkHttpClient client = new OkHttpClient();
//然后创建一个线程,因为我们这里学习的同步请求,当然你也可以在AsyncTask这样的异步任务里面同步调用
new Thread() {
@Override public void run() {
super.run();
//创建一个Request,他里面包括的你要请求的网址等信息,
// 同时这个类是构建者模式,我们在源码分析的时候会详解讲解
Request request = new Builder()
.url(“http://me.woblog.cn/”)
.build();
try {
//然后调用newCall方法,传入刚刚创建的Request对象
// 然后调用execute方法来执行这个请求
Response response = client.newCall(request).execute();
//通过调用response的body上的string方法可以得到流的字符串
Log.d(“TAG”, response.body().string()); //bytes数组
byte[] bytes = response.body().bytes(); //输入流
InputStream inputStream = response.body().byteStream();
//字符串流
Reader reader = response.body().charStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
总结起来就是:
1. 不管是异步还是通过都是先创建OkHttpClient,建议全局只有一个
2. 然后使用Request的内部类Builder来创建一个Request,并设置网址
3. 调用newCall的newCall方法传入request
4. 调用newCall方法返回的Call对象上面的execute来执行这个请求
5. 调用response的isSuccessful方法来判断是否请求成功
6. 调用response的body上面的string方法来获取一个字符串结果
我还可以通过response.body()的其他方法拿到bytes数组,输入流等信息。
其中我们拿到了输入流或者bytes数组我们可以用来手动解码一张图片,或者下载一个文件。
InputStream和Reader的区别
这个两个类我想做Android可能大家都不太熟悉,他们都是Java基础,但是这里又必要他们的区别:
InputStream:表示所有字节输入流的超类
Reader:表示所有字符输入流的超类
所以说他们的主要区别就是一个读取出来的是字节流,一个是字符流。
大家可能对读取一个文件的一行有印象,要实现该功能时我们需要将InputStream包装成Reader流。其他的就不延伸了,毕竟我们这本书主要讲的是Okhttp,关于这方面的信息大家有不太熟悉的可以参考其他的Java书籍。
异步Get请求
异步在Android中也是很常用的,我们来看看:
//同样还是先创建的request
Request request = new Request.Builder() .url(“http://me.woblog.cn/”)
.build();
//将newCall返回的Call对象加入调度队列
//同时这里传入了一个Callback对象,这就是异步回调
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//在这里错误处理 Log.d(TAG,e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//这里获取结果,和上面的同步调用获取方式一样
Log.d(TAG,response.body().string());
}
});
其中需要注意的是上面的onFailure,onResponse方法的调用虽然是异步调用的,但并不是在主线程,也就是说不能再改方法里面操作UI,比如:像下面这样是不允许的:
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//这里不能操作UI tv.setText(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//这里不能操作UI tv.setText(response.body().string());
}
});
数据取回来不能直接更新UI那还干嘛,是吧?如果想学可以在http://www.ixuea.com/books/1(需要付费)
本文来自《详解Okhttp网络框架电子书》,视频教程也可以通过:爱学啊官网、腾讯课堂、网易云课堂、淘宝教育学习。