1.最近项目开始了,在做一个android电视的项目。我选择了OkHttp作为网络框架,已经火了很久了。写这篇博客的目的是让自己熟悉下一些网络框架,不仅仅是停留在使用上。
实际开发中用到的网络请求主要分为两种请求,GET请求和POST请求。
开发者角度:GET请求和POST请求的区别就是GET没有POST那么安全,还有就是POST将请求参数放到请求体(Body)里面的,而GET是将请求参数放到请求头里面的。【个人理解,不到位的地方还请多多指教】
Request是封装OkHttp请求的类,Builder是其中的内部类,负责实现OkHttp请求体的各种属性.通过设置Builder就间接的设置了Request.
* Request属性介绍:[Url、method、RequestBody、tag、Headers.Builder]
* Url:访问的地址,必不可少的。必须设置。
* method:请求方式,GET方式访问调用的时候是直接:new Request.Builder(),这个时候就已经设置了method属性了,而POST方式的method属性是在new Request.Builder().post(Request)方法中帮我们设置了,总之我们调用了对应的方法也就自动的设置了method属性。
* RequestBody:个人理解就是封装请求参数的,这个不是必须的,有时候访问是没有参数的
* tag:这个暂时还不知道,但是不能为null,,在程序内部做了判断的。所以不需关心。
* Headers.Builders:请求头,封装了具体什么还不清楚。[只知道cokie就是放在请求头里面]
* 总之一句话,移动网络开发就是实现浏览器访问网页的功能!
GET请求
···
Get同步请求:
public void RequestGet(String url) throws IOException {
//第一步:初始化Request
request = new Request.Builder().url(url).build();
OkHttpClient mOkHttpClient = new OkHttpClient();
//第二步:封装成任务
Call call = mOkHttpClient.newCall(request);
//第三步:同步任务执行
call.execute();
}
Get异步请求:
public void RequestGet(String url, Callback callback) {
//第一步:初始化Request
request = new Request.Builder().url(url).build();
//第二步:封装成任务
Call call = mOkHttpClient.newCall(request);
//第三步:异步任务执行
call.enqueue(callback);
}
···
第一步:生成Request[可通过Builder设置各种属性]
第二步:通过OkHttpClient将Request封装成任务
第三步:执行任务[可以选择同步还是异步执行:一般都是异步执行,加入队列]
注意事项:
1.请求返回的是Response类,可以调用不同方法获得不同的数据
A.获取字符串:Response.body().string()。
B.获取字节数组:Response.body().bytes()。
C.获取流:Response.body().byteStream()。这个就可以用来下载文件!
2.第三步中可以选择call.enqueue(),也就是不加参数。
A.不加参数就是同步执行。同步执行就会阻塞主线程,相信这个一般情况下应该是不希望出现的吧。
B.加参数callback就是异步执行。
C.异步执行的方法不是在UI线程执行,所以需要结合Handler或者其他的工具进行UI更新。
D.GET方式是无法设置Requestbody属性的。[主要是因为设置了Requestbody属性后就变成了POST请求了。
···
Post异步请求
public void RequestAsyncPost(String url, Callback callback) {
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("name", "ZHUWANG");
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(callback);
}
Post同步请求
public void RequestAsyncPost(String url, Callback callback) {
FormEncodingBuilder builder1 = new FormEncodingBuilder(); 2.0的
FormBody.Builder builder=new FormBody.Builder();
builder.add("name","zhuwang");
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(callback);
}
···
第一步:准备好requestBody.通过查看源码可以知道:Post请求时必须要调用post(Requestbody body)方法的,不然要报错。【这是和GET请求最大的区别:必须调用Request.Builder.post()方法,目的是构造请求体和设置Request的method属性】
第二步:生成Request[可通过Builder设置各种属性]
第三步:通过OkHttpClient将Request封装成任务
第四步:执行任务[可以选择同步还是异步执行:一般都是异步执行,加入队列]
注意事项:
1.请求返回的是Response类,可以调用不同方法获得不同的数据
A.获取字符串:Response.body().string()。
B.获取字节数组:Response.body().bytes()。
C.获取流:Response.body().byteStream()。这个就可以用来下载文件!
2.第三步中可以选择call.enqueue(),也就是不加参数。
A.不加参数就是同步执行。同步执行就会阻塞主线程,相信这个一般情况下应该是不希望出现的吧。
B.加参数callback就是异步执行。
C.异步执行的方法不是在UI线程执行,所以需要结合Handler或者其他的工具进行UI更新。
3.Callback:这是异步请求的返回接口。
这是异步请求的返回接口。
void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;
很简单不用多说,只是提醒一下,这两个回调方法不能在UI线程执行更新UI的操作!
RequestBody是POST请求独有的,能够构造RequestBody的类有很多,从最简单的表单到复杂的文件上传,OkHttp3.0都有对应的类,使用这些类进行封装RequestBody在以后的操作中会经常遇到。下面我总结几种经常使用到的。
1. 表单提交
FormEncodingBuilder 这是2.0使用的。而3.0使用的是FromBody,它是RequestBody的子类。专门用于提交表单信息。
FormEncodingBuilder 2.0
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("name", "zhuwang");
FormBody.Builder 3.0
FormBody.Builder builder=new FormBody.Builder();
builder.add("name","zhuwang");
从名字上来说也很符合表单提交的意义!
2.如果是文件上传
MultipartBody:这个也是RequestBody的子类。这个是用于多文件上传的!
“`
/* 第一个要上传的file */
File file1 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + “/a.jpg”);
RequestBody fileBody1 = RequestBody.create(MediaType.parse(“application/octet-stream”) , file1);
String file1Name = “testFile1.txt”;
/* 第二个要上传的文件,这里偷懒了,和file1用的一个图片 */
File file2 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/a.jpg");
RequestBody fileBody2 = RequestBody.create(MediaType.parse("application/octet-stream") , file2);
String file2Name = "testFile2.txt";
/* form的分割线,自己定义 */
String boundary = "xx--------------------------------------------------------------xx";
MultipartBody mBody = new MultipartBody.Builder(boundary).setType(MultipartBody.FORM)
/* 上传一个普通的String参数 , key 叫 "p" */
.addFormDataPart("p" , "666")
/* 底下是上传了两个文件 */
.addFormDataPart("file" , file1Name , fileBody1)
.addFormDataPart("file" , file2Name , fileBody2)
.build();
Request request = new Request.Builder()
.url(url)
.post(mBody )
.build();
mOkHttpClient.newCall(request).enqueue(callback);
“`
好了,RequestBody就先总结道这儿了!下次再来修改!
所以OkHttp的回调接口Callback不能在UI线程执行更新UI的操作,这点很不爽,还需要自己封装。另外就是返回的Response类里面仅仅只能拿到字符串,流,bytes。不能直接拿到已经Json转出来的对象,所以还是得自己封装!
今天就这样!明天封装完成后再发表!希望能和大家一起交流沟通!