# easy-okhttp
**Repository Path**: gce/easy-okhttp
## Basic Information
- **Project Name**: easy-okhttp
- **Description**: 这是一个对okhttp3进行封装的工具,提供了更为便捷的方法调用。目的是为了替换难用的apache HttpClient。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 204
- **Created**: 2016-12-19
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# easy-okhttp
**重要提示:[关于老版本的文档在这里](./OLD-README.md)**
## 最新版本更新说明
此次更新属于重大更新,与之前的版本存在一定的不兼容
- 移除了方法`HttpClient.formDataPost()`,合并到`HttpClient.post()`方法中
- 更新了实例名`HttpClient.INSTANCE`为`HttpClient.Instance`
- 设置post参数的方法名由`formParam`更换为`param`
- HTTPS证书的方法由`setCertificates`更换为`https`
以上是变更的部分,那么此次更新的特点
+ 大部分代码进行了重写和整理
+ 对`OKHTTP`版本进行更新
+ post提交不在分两个方法,让调用者使用起来不顺手,自动判断是普通表单和文件表单
+ 对`OkHttpClient`实现全局单例,之前的版本每次都会创建一个实例
+ 对HTTPS支持单向认证和双向认证
+ 增加数据转换接口,统一数据处理
+ 终于提供了异步请求功能
+ 对于请求失败的信息更为详细
## 简介
项目`easy-okhttp`是对okhttp网络框架([https://github.com/square/okhttp](https://github.com/square/okhttp))封装,
提供文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。
`okhttp`网络框架的流行始于Android,但是在Java后端仍然是`Apache HttpClient`网络框架,这个框架的缺点在于设计非常的复杂,而且Jar的比较大。
故此我封装`okhttp`主要目的希望弃用`Apache HttpClient`;其次也是为了帮助`okhttp`的推广^_^
PS:本人Java技术水平一般,还在不断的学习中,所以项目难免存在bug,所以当出现问题的时候,请大家把问题共享出来,我会尽快处理,抑或我们一起讨论也可以的。
共享自己碰到的问题,方便你我他,也使得这个项目就会更加的富有生命力,谢谢!
## 参考与依赖
+ 依赖关系说明
* `okhttp`,本项目核心所在,底层依赖了`okio`框架,框架的大小在500Kb之内
* `mzlion-core`,项目依赖的工具类,底层依赖了`slf4j-api`和`gson`两个框架,框架的大小在400Kb之内
## 联系方式
* Qmail [mzllon@qq.com](mzllon@qq.com)
* QQ群 喜大奔普,QQ群建立啦:QQ群加入
## 文档目录(点击快速导航)
- [框架引入](#框架引入)
- [全局配置(可选)](#全局配置)
- [基本用法示例](#基本示例)
- [上传大文本数据、JSON类型的文本、大文件等](#上传大文本数据、JSON类型的文本、大文件等)
- [表单提交、一参数多值](#表单提交、一参数多值)
## 框架引入
项目基于Gradle管理,并且项目要已经上传到JCenter。
MAVEN
```xml
com.mzlion
easy-okhttp
1.0.5-beta
```
Gradle
```
compile 'com.mzlion:easy-okhttp:1.0.5-beta'
```
下载Jar
* 单文件版 [V1.0.3-beta Jar](http://jcenter.bintray.com/com/mzlion/easy-okhttp/1.0.5-beta/easy-okhttp-1.0.5-beta.jar)
* 含依赖版 [V1.0.5-beta zip]()
## 框架特性说明
* 仅支持GET和POST请求
* 基于POST的大文本数据、二进制文件上传,即通过Http Body提交
* 普通的表单提交
* 带有文件表单提交
* 表单提交支持参数名重复,在后台接收到的是数组或集合
* 支持session保持
* 支持链式调用
* 支持可信任证书和自定义签名证书的https访问
* 注释详细,并且提供了demo
* 更多特性增加中
## 全局配置
框架会自动读取classpath下的`easy-okhttp.properties`配置文件,如果没有特别的要求话,脚本不需要重载该配置文件的。
* `easy-okhttp.properties`配置文件的配置信息
+ connectTimeout 连接超时时间,默认设置10秒
+ readTimeout 内容读取超时时间,默认是30秒
+ writeTimeout 内容写入超时时间,默认30秒
+ 支持设置公共header,规则如下
以header开头的表示设置公共请求头,header.之后就是键名,等号之后的键对应的值
#header.partner = MZ2017
* 如果需要更改这些默认配置,有两种方式
+ 覆盖框架提供的配置`easy-okhttp.properties`,框架优先加载项目中的配置文件,超时时间的单位都是毫秒
+ 通过代码设置全局配置,下面会讲解到
* 通过代码也可以设置全局参数,该配置操作只需要操作一次,因而可以放在项目启动时配置。
+ 设置连接超时时间 `HttpClient.Instance.setConnectTimeout(int)`
+ 设置读取超时时间 `HttpClient.Instance.setReadTimeout(int)`
+ 设置写入超时时间 `HttpClient.Instance.writeTimeout(int)`
+ 设置自定义签名证书 `HttpClient.Instance.https(?)`
+ 设置默认Header `HttpClient.Instance.setDefaultHeader(?)`
## 基本示例
### 1.普通的GET请求无参数
```java
String responseData = HttpClient
.get("http://localhost:8080/okhttp-server-test/userInfo/pageSelect") // 请求方式和请求url
.execute()
.asString();
```
### 2.普通的GET请求带参数
```java
String responseData = HttpClient
.get("http://localhost:8080/okhttp-server-test/userInfo/pageSelect") // 请求方式和请求url
.queryString("username","mzlion") //设置请求参数
.execute()
.asString();
```
### 3.POST普通表单提交
```java
String responseData = HttpClient
.post("http://localhost:8080/okhttp-server-test/userInfo/create") // 请求方式和请求url
.param("username","mzlion") // 表单参数
.param("userPwd", "123") // 表单参数
//queryString("queryTime","20160530") //url参数
.execute()
.asString();
//formParam()重载方法还支持`Map`
```
## 上传大文本数据、JSON类型的文本、大文件等
一般针对POST提交数据内容较为复杂、接口约定需要POST上传时调用本方法非常有效。
这种提交方式也是POST,但是数据内容和格式直接写入请求流中。
### 1.POST提交String
```java
String responseData = HttpClient
.textBody("http://localhost:8080/okhttp-server-test/userInfo/create") // 请求方式和请求url
.text("设施一串和服务端约定好的数据格式")
// post提交json
//.charset("utf-8")
//设置编码
.execute()
.asString();
```
### 2.POST提交JSON格式的文本
```java
String responseData = HttpClient
.textBody("http://localhost:8080/okhttp-server-test/userInfo/create") // 请求方式和请求url
.json("{\"username\":\"mzlion\",\"userPwd\":\"123\"}")
// post提交json
//.xml("")
//post提交xml
//.html("function fun(){}")
//post提交html
//.charset("utf-8")
//设置编码
.execute()
.asString();
```
### 3.POST提交XML等其他格式的文本
```java
String responseData = HttpClient
.textBody("http://localhost:8080/okhttp-server-test/userInfo/create") // 请求方式和请求url
//.xml("")
//post提交xml
//.html("function fun(){}")
//post提交html
//.javascript("function fn(){}")
//post提交一段javascript
//.charset("utf-8")
//设置编码
.execute()
.asString();
```
### 4.POST提交二进制文件
```java
String responseData = HttpClient
.binaryBody("http://localhost:8080/okhttp-server-test/userInfo/avatar") // 请求方式和请求url
.stream(this.getClass().getClassLoader().getResourceAsStream("andy-bao.jpg"))
// post提交流
//.file(new File("d:/andy-bao.jpg")) //post提交文件
.contentType(ContentType.IMAGE_JPG)
//设置请求内容类型
.execute()
.asString();
//ContentType内置常见的MIME类型,基本上不用自己创建了
```
## 表单提交、一参数多值
### 1.POST表单提交含文件上传
```java
String responseData = HttpClient
.post("http://localhost:8080/okhttp-server-test/userInfo/createWithFile") // 请求方式和请求url
.param("userName", "test")
.param("userPwd", "123456")
.param("nickName", "Test")
.param("realName", "测试")
.param("hobby", "测试,就爱测试")
.param("avatarFile", this.getClass().getClassLoader().getResourceAsStream("andy-bao.jpg"), "andy-bao.jpg")
//.param("avatarFile", this.getClass().getClassLoader().getResourceAsStream("andy-bao.jpg"), "andy-bao.jpg")
.execute()
.asString();
//param()重载方法还支持`Map`
```
### 2.POST提交支持一个参数设置多个值或替换
```java
String responseData = HttpClient
.post("http://localhost:8080/okhttp-server-test/userInfo/createWithFile") // 请求方式和请求url
.param("userName", "test")
.param("useLanguages", "JAVA")
.param("useLanguages", "PHP") //后台应该这样接收`useLanguages[]`
.param("hobby", "看电影")
.param("hobby", "其实我喜欢写代码".true)//这就会对参数 hobby的原值替换
.execute()
.asString();
//param()重载方法还支持`Map`
```
## 同步请求更多说明
以上展示的代码都是基于同步请求的,并且你会发现示例代码中总是出现`asString()`方法,这个方法来自`HttpResponse`类
#### 7.HttpResponse对象介绍
1. `HttpResponse`类是对请求服务端的结果封装,包含了3个属性
* `isSuccess` 表示请求是否成功
* `errorMessage` 请求失败时错误消息
* `rawResponse` 原始的`Response`,当框架提供的功能无法满足时候,可以调用该属性处理。
**当请求执行完成之后一定需要判断请求成功还是失败。**
2. `HttpResponse`类提供对请求服务端的结果转换方法
默认的请求响应结果并不能直接参与编程,一般都需要经过一些转换,所以`HttpResponse`对象提供了几种常见的转换,下面直接通过示例解释各个方法的作用和应用。
**注意:当使用转换方法之前,最好调用方法`isSuccess()`判断请求响应是否成功,否则直接调用转换方法的话,如果响应失败,则会抛出'HttpClientException'异常**
```java
//将响应结果转为字符串输出
String responseData = httpResponse.asString();
//将响应结果转为文件保存
File frc = new File("d:\\web\\save.txt");
httpResponse.asFile(frc);
//json转换器
List personList = httpResponse.asBean(new TypeToken>(){});
//重载方法
//Person person = httpResponse.asBean(Person.class);
//将响应结果转为输出流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
httpResponse.asStream(baos);
```
### 高级配置
#### 为单个请求设置超时
当我们需要对单个请求设置连接超时时间、读取超时时间等属性时,可以在执行`execute`方法之前调用。主要有如下几个方法可以进行调用。
+ `connectionTimeout(int)` 连接超时时间
+ `readTimeout(int)` 读取超时时间
+ `certificates([])` 自定义签名证书设置
以上这些方法的调用会使得框架创建一个新的`OkHttpClient`对象。下面给出一个snippet加以说明。
```java
//字符串转换器
String responseData = HttpClient.get() //设置请求方式
.url("http://localhost:8080/okhttp-server-test/userInfo/avatar2") //设置请求地址
.queryString("id","2") //设置请求参数
.readTimeout(30000) //覆盖设置,读取超时时间
.execute() //执行
.asString();
```
#### 自定义签名网站https访问
1. 信任指定的自签名证书网站
自签名网站htts访问处理方式非常简单,首先拿到客户端的签名证书,一般通过浏览器就可以导出xxx.cer证书了。然后将拿到的证书文件拷贝到自己的项目中,然后按照如下方式调用或设置。
```java
//字符串转换器
String responseData = HttpClient.get() //设置请求方式
.url("http://localhost:8080/okhttp-server-test/userInfo/avatar2") //设置请求地址
.queryString("id","2") //设置请求参数
.readTimeout(30000) //覆盖设置,读取超时时间
.certificates(this.getClass().getClassLoader().getResourceAsStream("SRCA.cer"))
.execute() //执行
.asString();
```
2. 信任所有网站
该方法不推荐在生产环境使用,否则https的作用意义就失效了。信任所有网站的https访问设置非常简单,`HttpClient.INSTANCE.setCertificates()`即可。
## 关于demo
目前Demo还没完成,完成之后也会上传,方便大家直接把项目clone下来即可运行。