# easy-okhttp **Repository Path**: java10000/easy-okhttp ## Basic Information - **Project Name**: easy-okhttp - **Description**: 这是一个对oktthp3进行封装的工具,提供了更为便捷的方法调用。目的是为了替换难用的apache HttpClient. - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 205 - **Created**: 2016-07-19 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # easy-okhttp ## 简介 项目`easy-okhttp`是对okhttp网络框架(https://github.com/square/okhttp)上层封装, 支持文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。 okhttp网络框架的流行始于Android,但是在Java后端仍然是`Apache HttpClient`网络框架,这个框架的缺点在于设计非常的复杂,而且Jar的大小也很大。故此我封装okhttp主要目的希望弃用`Apache HttpClient`;其次也是为了帮助okhttp的推广^_^ ## 参考与依赖 + 参考项目说明 * [https://github.com/hongyangAndroid/okhttp-utils](mailto:https://github.com/hongyangAndroid/okhttp-utils) + 依赖关系说明 * `okhttp`,本项目核心所在,底层依赖了`okio`框架,框架的大小在500Kb之内 * `mzlion-core`,项目依赖的工具类,底层依赖了`slf4j-api`和`gson`两个框架,框架的大小在400Kb之内 ## 联系方式 * Gmail [and.mz.yq@gmail.com](and.mz.yq@gmail.com) * QQ群 目前暂未建立,如果大家有所需要共同讨论,可以在留言,然后我新建QQ群 ## 用法 ### 框架引入 项目基于Maven管理,并且项目要已经上传到JCenter,所以只要在您的项目添加如下依赖。 ```xml jcenter bintray jcenter http://jcenter.bintray.com/ true ``` ```xml com.mzlion easy-okhttp 1.0.0-beta ``` ### 支持功能说明 * GET和POST请求 * 基于POST的大文本数据、二进制文件上传,即通过Http Body提交 * 普通的表单提交 * 带有文件表单提交 * 表单提交支持参数名重复,在后台接收到的是数组或集合 * 支持session保持 * 支持链式调用 * 支持可信任证书和自定义签名证书的https访问 * 更多特性增加中 ### 全局配置(可选) * 框架会自动读取classpath下的`easy-okhttp.properties`配置文件,该配置文件包含如下配置信息 + okhttp.connectionTimeout 连接超时时间,默认设置10秒 + okhttp.readTimeout 内容读取超时时间,默认是30秒 * 如果需要更改这些默认配置,有两种方式 + 覆盖框架提供的配置`easy-okhttp.properties`,框架优先加载项目中的配置文件 + 通过代码设置全局配置,下面会讲解到 * 通过代码也可以设置全局参数,该配置操作只需要操作一次,因而可以放在项目启动时配置。 + 设置连接超时时间 `HttpClient.INSTANCE.setConnectionTimeout(int)` + 设置读取超时时间 `HttpClient.INSTANCE.setReadTimeout(int)` + 设置自定义签名证书 `HttpClient.INSTANCE.setCertificates(?)` + 设置默认Header `HttpClient.INSTANCE.setDefaultHeader(String,String)` ### 示例 #### 1.普通的GET请求无参数 ```java DefaultResponseConverter responseConverter = new DefaultResponseConverter(); HttpResponse httpResponse = HttpClient .get("http://localhost:8080/okhttp-server-test/userInfo/pageSelect") // 请求方式和请求url .execute(responseConverter); ``` #### 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 .formParam("username","mzlion") // 表单参数 .formParam("userPwd", "123") // 表单参数 //queryString("queryTime","20160530") //url参数 .execute() .asString(); ``` #### 4.POST提交String ```java String responseData = HttpClient .stringBody("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(); ``` #### 5.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(); ``` #### 6.POST表单提交含文件上传 ```java String responseData = HttpClient .formDataPost("http://localhost:8080/okhttp-server-test/userInfo/createWithFile") // 请求方式和请求url .formParam("userName", "test") .formParam("userPwd", "123456") .formParam("nickName", "Test") .formParam("realName", "测试") .formParam("hobby", "测试,就爱测试") .formParam("avatarFile", this.getClass().getClassLoader().getResourceAsStream("andy-bao.jpg"), "andy-bao.jpg") //.formParam("avatarFile", this.getClass().getClassLoader().getResourceAsStream("andy-bao.jpg"), "andy-bao.jpg") .execute() .asString(); ``` #### 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下来即可运行。