OkHttp—成熟的联网工具
来源:互联网 发布:999是什么意思网络语言 编辑:程序博客网 时间:2024/05/22 00:22
参考资料:
官方介绍 点击产看
GitHub源码 点击下载
介绍:
Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
OkHttp支持Android 2.3及其以上版本。对于Java, JDK1.7以上
依赖:
compile 'com.squareup.okhttp3:okhttp:3.3.1'
主要使用的类:
OkHttpClient、Request、Call 和 Response。Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应。
OkHttpClient
OkHttpClient表示了HTTP请求的客户端类,在绝大多数的App中,我们只应该执行一次new OkHttpClient(),将其作为全局的实例进行保存,从而在App的各处都只使用这一个实例对象,这样所有的HTTP请求都可以共用Response缓存、共用线程池以及共用连接池。
默认情况下,直接执行OkHttpClient client = new OkHttpClient()就可以实例化一个OkHttpClient对象。
可以配置OkHttpClient的一些参数,比如超时时间、缓存目录、代理、Authenticator等,那么就需要用到内部类OkHttpClient.Builder,设置如下所示:
OkHttpClient client = new OkHttpClient.Builder(). readTimeout(30, TimeUnit.SECONDS). cache(cache). proxy(proxy). authenticator(authenticator). build();
OkHttpClient本身不能设置参数,需要借助于其内部类Builder设置参数,参数设置完成后,调用Builder的build方法得到一个配置好参数的OkHttpClient对象。这些配置的参数会对该OkHttpClient对象所生成的所有HTTP请求都有影响。
//获取实例 OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间 .connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间 .build();
Request
Request类封装了请求报文信息:请求的Url地址、请求的方法(如GET、POST等)、各种请求头(如Content-Type、Cookie)以及可选的请求体。一般通过内部类Request.Builder的链式调用生成Request对象。
Request request = new Request.Builder().url(url).build();
Call
Call代表了一个实际的HTTP请求,它是连接Request和Response的桥梁,通过Request对象的newCall()方法可以得到一个Call对象。Call对象既支持同步获取数据,也可以异步获取数据。
1: 执行Call对象的execute()方法,会阻塞当前线程去获取数据,该方法返回一个Response对象。
2: 执行Call对象的enqueue()方法,不会阻塞当前线程,该方法接收一个Callback对象,当异步获取到数据之后,会回调执行Callback对象的相应方法。如果请求成功,则执行
Callback对象的onResponse方法,并将Response对象传入该方法中;如果请求失败,则执行Callback对象的onFailure方法。
Call call = client.newCall(request); call.enqueue(new Callback() { }
Response
Response类封装了响应报文信息:状态吗(200、404等)、响应头(Content-Type、Server等)以及可选的响应体。可以通过Call对象的execute()方法获得Response对象,异步回调执行Callback对象的onResponse方法时也可以获取Response对象。
call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 更新界面.. callback.onFailure(-1); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.code()==200){ InputStream inputStream = response.body().byteStream(); callback.onResponse(inputStream); }else{ callback.onFailure(response.code()); } } });
同步Get请求—execute
以下示例演示了如何同步发送GET请求,输出响应头以及将响应体转换为字符串。
private final OkHttpClient client = new OkHttpClient();//创建OkHttp对象public void run() throws Exception {//get请求数据 Request request = new Request.Builder() .url("http://publicobject.com/helloworld.txt") .build();//execute方法是同步方法,会阻塞当前线程,其返回Response对象。 Response response = client.newCall(request).execute();//判断请求是否成功 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); Headers responseHeaders = response.headers(); for (int i = 0; i < responseHeaders.size(); i++) { System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); } System.out.println(response.body().string());}
Response的headers()方法可以得到响应头Headers对象,可以通过for循环索引遍历所有的响应头的名称和值。可以通过Headers.name(index)方法获取响应头的名称,通过Headers.value(index)方法获取响应头的值。
异步GET—enqueue
以下示例演示了如何异步发送GET网络请求,代码如下所示:
private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception { Request request = new Request.Builder() .url("http://publicobject.com/helloworld.txt") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); Headers responseHeaders = response.headers(); for (int i = 0, size = responseHeaders.size(); i < size; i++) { System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); } System.out.println(response.body().string()); } }); }
请求头和响应头
型的HTTP请求头、响应头都是类似于Map
private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception { Request request = new Request.Builder() .url("https://api.github.com/repos/square/okhttp/issues") .header("User-Agent", "OkHttp Headers.java") .addHeader("Accept", "application/json; q=0.5") .addHeader("Accept", "application/vnd.github.v3+json") .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println("Server: " + response.header("Server")); System.out.println("Date: " + response.header("Date")); System.out.println("Vary: " + response.headers("Vary")); }
上面的代码通过addHeader方法添加了两个Accept请求头,且二者的值不同,这样服务器收到客户端发来的请求后,就知道客户端既支持application/json类型的数据,也支持application/vnd.github.v3+json类型的数据。
- OkHttp—成熟的联网工具
- 成熟软件配置管理工具的特征
- OKhttp的使用-工具类
- okHttp的一个工具类
- 自己整理的OkHttp工具——留存用
- 广播与okhttp联网(实现联网就访问网络的功能)
- 重要的和成熟的手机跨平台工具
- 非常简单的OKhttp封装工具类
- okhttp传输封装的工具类
- Android Okhttp工具类的封装
- 物联网的开源工具
- 物联网的开源工具
- 物联网时代的35款开源工具
- 【物联网】OpenWrt SCP工具的使用
- 物联网时代的35款开源工具
- 物联网时代的35款开源工具
- 物联网时代的35款开源工具
- 物联网时代的35款开源工具
- 浅析JavaScript的原型对象、原型链和面向对象的特点
- C语言再学习 -- 时间函数
- ubuntu 16.04 vm虚拟机 nat 配置静态ip
- Dijkatra 迪克斯特拉双栈算术表达式求值算法 Java
- Ubuntu系统预处理、编译、汇编、链接指令
- OkHttp—成熟的联网工具
- ARM编译遇到"thumb conditional instruction should be in IT block"问题
- iOS开发 - 兼容iOS 10 资料整理笔记
- Android 内存泄漏和OOM分析(一)
- 在github上写自己的博客
- 语句方式创建约束
- Android的接口回调在网络请求中的应用示例
- ROS入门_1.9 理解ROS话题
- 互联网金融架构发展史