最近打算写一个实现登陆学校的网站,实现查询成绩选课等等功能的app。于是就要用到OKHttp持久化cookie的相关知识,没有使用retrofit,所以打算认真写一篇博客来和大家分享一下我的学习心得。
GITHUB的地址是:https://github.com/CallMeSp/University_in_Hand.git
添加依赖什么的就不多说了,直接进入正文吧。
学校教务处的网站是:http://202.119.225.34/default2.aspx
我们会发现是带验证码的登陆,所以就不是简单的填表单然后post就可以的了,首先要获取这张验证码的图片,让它在我们的界面中显示出来。先来看一下效果吧:
在教务处网站查看源代码即可知道验证码的地址为:http://202.119.225.34/CheckCode.aspx
接下来我们要做的事情就是用okhttp把它缓存下来,换成成bitmap格式,然后在ImageView中显示出来即可。思路清晰后就开始行动。
1.定义Request:
Request request=new Request.Builder()
.url("http://202.119.225.34/CheckCode.aspx")
.build();
这里说句题外话,我个人还是非常喜欢这种流式的方法定义形式的,所以以后如果自己写一些工具库也会尽量用这种方式,看起来结构清晰容易阅读。
2.定义CLient:
OkHttpClient myclient=new OkHttpClient.Builder()
.build();
3.用刚刚定义的CLient来发送刚刚定义的Request请求:
myclient.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {
InputStream is = response.body().byteStream();
final Bitmap bm = BitmapFactory.decodeStream(is);
runOnUiThread(new Runnable() {
@Override
public void run() {
Img_check.setImageBitmap(bm);
}
});
}
});
这里代码也很清晰,我们只是一个简单的测试,所以也不用去管onFailure里面的内容,直接空着就可以了。在onResponse中将返回的response转换成InputStream字节流,然后用bitmap读取就可以了。
InputStream is = response.body().byteStream();
final Bitmap bm = BitmapFactory.decodeStream(is);
另外一个要注意的细节就是更改UI要在主线程中实现:
runOnUiThread(new Runnable() {
@Override
public void run() {
Img_check.setImageBitmap(bm);
}
});