OkHttp3.0的基本使用

来源:互联网 发布:七爷交友平台知乎 编辑:程序博客网 时间:2024/06/05 02:29

概述

1.最近项目开始了,在做一个android电视的项目。我选择了OkHttp作为网络框架,已经火了很久了。写这篇博客的目的是让自己熟悉下一些网络框架,不仅仅是停留在使用上。

网络请求GET和POST

实际开发中用到的网络请求主要分为两种请求,GET请求和POST请求。
开发者角度:GET请求和POST请求的区别就是GET没有POST那么安全,还有就是POST将请求参数放到请求体(Body)里面的,而GET是将请求参数放到请求头里面的。【个人理解,不到位的地方还请多多指教】

Request

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请求
···
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请求

···
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:这是异步请求的返回接口。

这是异步请求的返回接口。

Callback


void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;

很简单不用多说,只是提醒一下,这两个回调方法不能在UI线程执行更新UI的操作!

RequestBody

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转出来的对象,所以还是得自己封装!
今天就这样!明天封装完成后再发表!希望能和大家一起交流沟通!

原创粉丝点击