认识OKHttp
来源:互联网 发布:靠谱泰国代购淘宝 知乎 编辑:程序博客网 时间:2024/06/17 12:48
认识OKHttp
- OKHttp介绍
- OKHttp基本配置
- OKHttp基本使用
- 2.X与3
- 代码实例
- 参考内容
OKHttp介绍
OkHttp是一款较为轻量级的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
其中:
内置连接池,支持连接复用,减少延迟。相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。连接池类位于okhttp3.ConnectionPool。
简单了解一下源码,其基本运作逻辑:在put新连接到队列的时候会先执行清理闲置连接的线程,线程中不停调用Cleanup 并返回下次清理的间隔时间。继而进入wait 等待之后释放锁,继续执行下一次的清理。理解为监测时间并释放连接的后台线程。
OKHttp基本配置
- 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
- 导入
MAVEN
<dependency> <groupId>com.squareup.okhttp3<groupId> <artifactId>okhttp<artifactId> <version>3.2.0<version><dependency>
GRADLE
compile 'com.squareup.okhttp3:okhttp:3.2.0'
OKHttp基本使用
- GET请求
Request:是用来构建一个请求对象的,符合Http请求的标准,包含了请求头,方法等等属性,较为复杂,因此同样提供Builder模式构建
Response:是用来构建一个响应对象的,包含了响应头,响应码,数据等等属性,同样也提供Builder模式构建
同步和异步请求,都是调用OkHttpClient的newCall方法创建一个RealCall对象,然后通过这个对象,执行请求的
OkHttpClient client = new OkHttpClient();String run(String url) throws IOException { Request request = new Request.Builder().url(url).build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); }}
- 异步GET请求
execute()改为enqueue()方法,并给出回调接口。
client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { }});
- POST请求
大作业中就遇到了POST方法提交JSON数据的情景,只需要额外通过RequestBody创建一个消息体。
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");public static String jsonPost(String url, String json) throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } }
2.X与3
比较一下OKHttp3和2.X的老版本在哪些方面做出了改变,更利于开发人员的编程工作。
- OkHttpClient创建方式不同
okhttp直接new OkHttpClient实例,而okhttp3中提供了Builder,很好的使用了创建者设计模式 - post消息体构建方式不同
okhttp主要使用FormEncodingBuilder构建post消息体,okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,MultipartBody.Builder既可以添加表单数据,也可以添加文件等二进制数据 - Cookie管理
3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。
而2.X的版本使用CookieHandler进行委托管理
/* cookie管理 */ mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL); mOkHttpClient.setCookieHandler(mCookieHandler);
代码实例
项目中简单应用的两个方法贴上来,使用的是2.X的版本,涉及到http请求头的Authorization身份验证,POST请求,GET请求
public static String jsonPost(String url, String json) throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } } public static String authGet(final String url, final String username, final String password) throws IOException { OkHttpClient client = new OkHttpClient(); String auth = username + ":" + password; String token = Base64.encodeToString(auth.getBytes(), Base64.DEFAULT); Request request = new Request.Builder() .url(url) .addHeader("Authorization", "Basic " + token) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } }
参考内容
- OKHttp官网:http://square.github.io/okhttp/
阅读全文
0 0
- 认识OKHttp
- OkHttp初认识
- OkHttp
- okhttp
- OkHttp
- OkHttp
- OkHttp
- okhttp
- OKHTTP
- okhttp
- Okhttp
- okHttp
- OkHttp
- okhttp
- Okhttp
- okhttp
- OkHttp
- okhttp
- Android性能优化之巧用软引用与弱引用优化内存使用
- 获取过度颜色百分比及设置背景颜色渐变
- 6.27
- unity之安卓手机截屏并显示在相册
- 面试题38—数字在排序数组中出现的次数
- 认识OKHttp
- jQuery 中的proxy()和delegation()方法
- JZOJ 5163【NOIP2017模拟6.25】PS的烦恼
- Linux下rpm及yum安装jdk
- python与数据挖掘-笔记2
- eval调研
- java中十六进制编码与解码
- 安装MyEclipse插件svn
- 手工创建cdb数据库(create database语句)