OkHttp3.0的基本使用

概述

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

你可能感兴趣的:(android网络开发)