网络框架OKHTTP使用场景全解析
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
一、引言
说句实话,我之前一直在用 Jsoup 作为网络请求的框架首选,因为它使用简单、快捷,自带 HTML 文档解析,很适合用于爬虫这种场景。但是当我进入公司,涉及到网络请求场景的时候,更多的则是使用 OkHttp 框架。
二、入门
OkHttp 有哪些特点呢?根据官方说明总结如下:
- 支持HTTP/2,HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发,通过在一个连接上一次性发送多个请求来发送或接收数据。
- 如果HTTP/2不可用,连接池复用技术也可以极大减少延时。
- 默认支持GZIP,可以压缩下载体积。
- 响应缓存可以完全避免网络重复请求。
- 会从很多常用的连接问题中自动恢复。
- 如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP
- OkHttp还处理了代理服务器问题和SSL握手失败问题。
使用 OkHttp 很容易。它的请求/响应 API 具有流畅的构建器和不变性,这源自于 OkHttp 大量使用了 Builder 模式构建 Request / Response 对象。同时,OkHttp 支持同步阻塞调用和带有回调的异步调用。
三、使用
导入依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.2.0</version>
</dependency>
GET请求:简单请求
/**
* GET请求:简单请求
*/
@Test
public void get() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
GET请求:异步回调
/**
* GET请求:异步回调请求
*/
@Test
public void get2() throws InterruptedException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
// 3.浏览器发出请求,返回Response响应
okHttpClient.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()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
});
Thread.sleep(3000);
}
GET请求:下载文件
/**
* GET请求:下载文件
*/
@Test
public void get3() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("https://ystblog.com/assets/img/wechat.png")
.get()
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
// 保存文件到本地
File file = new File("image.png");
try (InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = new FileOutputStream(file)) {
byte[] bytes = new byte[1024];
int size;
while ((size = inputStream.read(bytes)) > 0) {
fileOutputStream.write(bytes, 0, size);
fileOutputStream.flush();
}
System.out.println("文件保存在:" + file.getAbsolutePath());
}
} else {
System.err.println(response);
}
}
POST请求:发送JSON串
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
/**
* POST请求:发送JSON串
* <p>
* MediaType.parse("application/json; charset=utf-8")
* <p>
* 该方式同样适用于发送任意单一内容:文字、文件、字节流等
*/
@Test
public void post() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{}"))
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
POST请求:发送二进制数据
/**
* POST请求:发送二进制数据
* <p>
* MediaType.parse("application/octet-stream")
*/
@Test
public void post4() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(RequestBody.create(MediaType.parse("application/octet-stream"), new File("image.png")))
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
POST请求:发送文字表单
/**
* POST请求:发送文字表单
* <p>
* MediaType.parse("application/x-www-form-urlencoded")
* <p>
* 对键值对参数进行URL编码封装,也就是Query参数串:k1=v1&k2=v2&k3=v3
*/
@Test
public void post2() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(new FormBody.Builder().add("key", "value").build())
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
POST请求:发送文件表单
/**
* POST请求:上传文件
* <p>
* MediaType.parse("multipart/form-data")
*/
@Test
public void post3() throws IOException {
// 1.构建请求客户端,设置超时时间、代理等,可以理解为配置一个浏览器
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构建请求实体,包括请求的URL、请求方法、请求头
File file = new File("image.png");
Request request = new Request.Builder()
.url("https://imgkr.com/api/files/upload")
.addHeader("user-agent", "Mozilla/5.0")
.post(new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/png"), file))
.build())
.build();
// 3.浏览器发出请求,返回Response响应
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println(response);
}
}
四、链接
OkHttp 官网:https://github.com/square/okhttp/
版权声明
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
网络框架OKHTTP使用场景全解析的更多相关文章
- Android网络框架OkHttp之get请求(源码初识)
概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...
- Android图片载入框架最全解析(一),Glide的基本使用方法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号.扫一扫文章底部的二维码或在微信搜索 郭 ...
- ECCV 2018 | 旷视科技提出统一感知解析网络UPerNet,优化场景理解
全球计算机视觉三大顶会之一 ECCV 2018(European Conference on Computer Vision)即将于 9 月 8 -14 日在德国慕尼黑拉开帷幕.届时,旷视首席科学家孙 ...
- Android图片加载框架最全解析(八),带你全面了解Glide 4的用法
本篇将是我们这个Glide系列的最后一篇文章. 其实在写这个系列第一篇文章的时候,Glide就推出4.0.0的RC版了.那个时候因为我一直研究的都是Glide 3.7.0版本,再加上RC版本还不太稳定 ...
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
不知不觉中,我们的Glide系列教程已经到了第六篇了,距离第一篇Glide的基本用法发布已经过去了半年的时间.在这半年中,我们通过用法讲解和源码分析配合学习的方式,将Glide的方方面面都研究了个遍, ...
- Android图片加载框架最全解析(四),玩转Glide的回调与监听
大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
在本系列的上一篇文章中,我带着大家一起阅读了一遍Glide的源码,初步了解了这个强大的图片加载框架的基本执行流程. 不过,上一篇文章只能说是比较粗略地阅读了Glide整个执行流程方面的源码,搞明白了G ...
- Android图片加载框架最全解析(一),Glide的基本用法
现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有 ...
随机推荐
- [JavaWeb基础] 029.OGNL表达式介绍
1.OGNL概述 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对 ...
- 读Pyqt4教程,带你入门Pyqt4 _004
在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...
- Java的基本数据类型及其封装类
Java的基本数据类型及其封装类 一.8种基本数据类型 二.基本数据类型的包装类及大小 三.基本数据类型和封装类的区别 定义不同.封装类是对象,基本数据类型不是: 使用方式不同.封装类需要先new初始 ...
- 接口(interface)的使用
类实现接口就具有接口的功能 实现可以多实现,实现多个接口 package cm.aff.abst; /* 接口(interface)是与类并行的一个概念 1. 接口可以看做是一个特殊的抽象类,是常量与 ...
- 【转】eclipse找不到或无法加载主类
Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法! 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,bin文件夹下没有.class文件,至少遇到3次这个问题了 ...
- ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作
前言: 本章主要通过一个完整的示例讲解ASP.NET Core MVC+EF Core对MySQL数据库进行简单的CRUD操作,希望能够为刚入门.NET Core的小伙伴们提供一个完整的参考实例.关于 ...
- 编程-Byte order & Bit order
https://mp.weixin.qq.com/s/B9rKps4YsLiDTBkRks8rmQ 看到比特序和字节序放在一起被提及,想必就已经填补了概念拼图里面缺失的那一块了,这一块正是比特序. 一 ...
- js实现浏览器打印功能
最近接触到一个新需求,实现打印机打印小票的功能.打的一桌子小票(惭愧),不过也基本满足了业务上的需求,现在分享一下如何实现(好记性不如烂笔头) 先上代码 // 布局代码 <div id=&quo ...
- Java实现 LeetCode 383 赎金信
383. 赎金信 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成.如果可以构成,返回 t ...
- Java实现 蓝桥杯VIP 算法提高 选择排序
算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB 选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...