Android 的网络请求框架,现在事层出不穷,比如之前介绍的和,除此之外OkHttp也是Android网络请求非常优秀的框架,而且据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了,如此优秀的网络请求框架,需要我们去学习一下。
在网上有很多关于OkHttp的使用文章,那么我为什么还要写该片文章呢?一是为了普及那些还没有使用过OkHttp的开发者认识到OkHttp这一优秀框架,二是该文章收集了比较优秀的OkHttp文章,让读者可以在该文章中直接找到学习OkHttp的精华文章。
简介
我们直接看到的介绍:OkHttp是默认有效的HTTP客户端,而且具有的优点:
1、连接池可减少请求延迟(如果HTTP / 2不可用);
2、透明的GZIP缩小下载大小;
3、响应缓存避免了完全重复请求的网络。
网络请求使用
1)配置环境
在app的build.gradle中添加OkHttp的依赖
compile 'com.squareup.okhttp3:okhttp:3.9.1'复制代码
由于OkHttp内部依赖okio,需要同时添加okio依赖:
compile 'com.squareup.okio:okio:1.6.0'
配置好环境就可以使用的了。
2)get请求
OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url("https://interface.meiriyiwen.com/article/today?dev=1").build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("test","text------>"+response.body().string()); } });复制代码
注意:需要用到call.enqueue的方法进行异步请求,其回调的onResponse方法是运行在线程里的。
3)POST请求提交Json数据
try { JSONObject jsonObject = new JSONObject(); jsonObject.put("version","3.5"); jsonObject.put("platform","android"); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON,jsonObject.toString()); OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request .Builder() .url("http://v3.wufazhuce.com:8000/api/hp/detail/1557") .post(body) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("test","text------>"+response.body()); } }); } catch (JSONException e) { e.printStackTrace(); }复制代码
需要在创建一个MediaType,并且调用MediaType.parse("application/json; charset=utf-8")
指定JSON类型。创建一个RequestBody对象,在Builder的post方法传入即可。
4)POST提交表单
OkHttpClient okHttpClient = new OkHttpClient(); FormBody body = new FormBody .Builder() .add("version","3.5") .add("platform","android") .build(); Request request = new Request .Builder() .url("http://v3.wufazhuce.com:8000/api/hp/detail/1557") .post(body) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("test","text------>"+response.body().string()); } });复制代码
注意:需要用到FormBody对象,传入表单的键对值,在OkHttp3.0之前使用的是FormEncodingBuilder对象,在3.0之后FormEncodingBuilder已被FormBody取代,同样在post方法传入该对象即可。
本文也参考了关于OkHttp比较优秀的文章,读者如果想深入学习,希望可以参考一下文章:
对OkHttp的封装,可以参考鸿洋大神的这篇文章: