Android OkHttp3简介和使用详解

Posted wx62aa9429a5df6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OkHttp3简介和使用详解相关的知识,希望对你有一定的参考价值。


一 、OKHttp简介

OKHttp是一个处理网络请求的开源项目,android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。


1、OKHttp优点

支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)

socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。

基于Headers的缓存策略减少重复的网络请求。

拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。


2、OKHttp的功能

PUT,DELETE,POST,GET等请求

文件的上传下载

加载图片(内部会图片大小自动压缩)

支持请求回调,直接返回对象、对象集合

支持session的保持


二 OkHttp3使用

首先要在AndroidManifest.xml里添加网络权限,如果需要上传或下载文件还需要添加存储卡读写权限:


   

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.1、get请求

1、异步get请求


       

public void getAsyncRequest()

//1、创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();

//通常使用OkHttpClient client = new OkHttpClient.Builder()//里面存在许多默认的配置

//2、创建Request对象,设置一个URL地址,设置请求方式

Request request = new Request.Builder()

.url("http://www.baidu.com")

.get()

.build();

//3、创建一个call对象,参数为request请求对象

Call call = client.newCall(request);

//4、将请求加入调度,重写回调方法

call.enqueue(new Callback()

@Override

public void onFailure(Call call, IOException e)

//请求失败





@Override

public void onResponse(Call call, Response response) throws IOException

//请求成功

if (response.isSuccessful())

runOnUiThread(new Runnable()

@Override

public void run()





);







);

2.1.1、发送一个异步GET请求的4个步骤:

(1)创建OkHttpClient对象

(2)通过Builder模式创建Request对象,参数必须有个url参数,可以通过Request.Builder设置更多的参数比如:header、method等

(3)通过request的对象去构造得到一个Call对象,Call对象有execute()和cancel()等方法。

(4)以异步的方式去执行请求,调用的是call.enqueue,将call加入调度队列,任务执行完成会在Callback中得到结果。

注意事项:

(1)Request.Builder中默认的使用Get请求,所以可以不调用get()方法

(2)无论是同步还是异步请求,接收到Response对象时均在子线程中,其中通过Response对象获取请求结果需要在子线程中完成,我们不能在子线程更新UI,需要借助于 runOnUiThread() 方法或者 Handler 来处理。

(3)onResponse回调有一个参数是response,如果我们想获得返回的是字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调response.body().byteStream(),有inputStream我们就可以通过IO的方式写文件。onResponse执行的线程并不是UI线程。


2.1.2、同步GET请求

(同步GET请求和异步GET请求基本一样,不同地方是同步请求调用Call的execute()方法,而异步请求调用call.enqueue()方法)


     

public void getSyncRequest()

//1、创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();

//2、创建request对象

Request request = new Request.Builder()

.url("http://www.baidu.com")

.build();

//3、创建call对象

Call call = client.newCall(request);

//4、同步调用会阻塞主线程,这边在子线程进行

new Thread(new Runnable()

@Override

public void run()

try

//同步调用,返回response,会抛出IO异常

Response response = call.execute();

if (response.isSuccessful())





catch (IOException e)

e.printStackTrace();





).start();


2.2、post请求

2.2.1、POST请求提交键值对

       

public void postAsyncRequest()

//创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();



//通过new FormBody()调用build方法创建RequestBody,用add()添加键值对

RequestBody requestBody = new FormBody.Builder()

.add("username","admin")

.add("password","123")

.build();



//设置URL地址,将RequestBody作为post方法的参数传入

Request request = new Request.Builder()

.url("http://www.baidu.com")

.post(requestBody)

.build();

//创建call对象,参数就是Request请求对象

Call call = client.newCall(request);

//将请求加入调度,重写回调方法

call.enqueue(new Callback()

@Override

public void onFailure(Call call, IOException e)

//请求失败





@Override

public void onResponse(Call call, Response response) throws IOException

//请求成功

if (response.isSuccessful())

runOnUiThread(new Runnable()

@Override

public void run()





);





);




2.2.2、一个异步POST请求提交键值对的5个步骤:

(1)创建OkHttpClient对象。

(2)通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 ,FormBody 是 RequestBody 的子类。

(3)创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入。

(4)创建一个call对象,参数就是Request请求对象。

(5)请求加入调度,重写回调方法。


4、异步POST请求提交字符串(POST请求提交字符串和POST请求提交键值对非常相似,不同地方主要是RequestBody)


     

public void postAsyncRequest()

//创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();



MediaType mediaType = MediaType.parse("application/json; charset=utf-8");

String value = "username:admin;password:123";

//通过RequestBody.create创建RequestBody对象

RequestBody requestBody = RequestBody.create(mediaType,value);



//设置URL地址,将RequestBody作为post方法的参数传入

Request request = new Request.Builder()

.url("http://www.baidu.com")

.post(requestBody)

.build();

//创建call对象,参数就是Request请求对象

Call call = client.newCall(request);

//将请求加入调度,重写回调方法

call.enqueue(new Callback()

@Override

public void onFailure(Call call, IOException e)

//请求失败





@Override

public void onResponse(Call call, Response response) throws IOException

//请求成功

if (response.isSuccessful())

runOnUiThread(new Runnable()

@Override

public void run()





);





);




2.2.3、异步POST请求上传文件

       

public void postAsyncRequest()

//创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();



MediaType mediaType = MediaType.parse("application/octet-stream");

File file = new File(Environment.getExternalStorageDirectory(),"1.png");

RequestBody requestBody = RequestBody.create(mediaType,file);



//设置URL地址,将RequestBody作为post方法的参数传入

Request request = new Request.Builder()

.url("http://www.baidu.com")

.post(requestBody)

.build();

//创建call对象,参数就是Request请求对象

Call call = client.newCall(request);

//将请求加入调度,重写回调方法

call.enqueue(new Callback()

@Override

public void onFailure(Call call, IOException e)

//请求失败





@Override

public void onResponse(Call call, Response response) throws IOException

//请求成功

if (response.isSuccessful())

runOnUiThread(new Runnable()

@Override

public void run()





);





);



以上是关于Android OkHttp3简介和使用详解的主要内容,如果未能解决你的问题,请参考以下文章

关于Okhttp3api使用

SpringBoot Java后端实现okhttp3超时设置

Android实战——okhttp3的使用和封装

网络请求框架OkHttp3全解系列:OkHttp的基本使用

Android项目中okhttp3的简易封装和使用

okhttp3每次new