项目 easy-okhttp
是对okhttp网络框架( https://github.com/square/okhttp)上层封装,
支持文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。
okhttp网络框架的流行始于Android,但是在Java后端仍然是 Apache HttpClient
网络框架,这个框架的缺点在于设计非常的复杂,而且Jar的大小也很大。故此我封装okhttp主要目的希望弃用 Apache HttpClient
;其次也是为了帮助okhttp的推广 _^
okhttp
,本项目核心所在,底层依赖了 okio
框架,框架的大小在500Kb之内 mzlion-core
,项目依赖的工具类,底层依赖了 slf4j-api
和 gson
两个框架,框架的大小在400Kb之内 项目基于Maven管理,并且项目要已经上传到JCenter,所以只要在您的项目添加如下依赖。
<repository> <id>jcenter</id> <name>bintray jcenter</name> <url>http://jcenter.bintray.com/</url> <releases> <enabled>true</enabled> </releases> </repository>
<dependency> <groupId>com.mzlion</groupId> <artifactId>easy-okhttp</artifactId> <version>1.0.0-beta</version> </dependency>
easy-okhttp.properties
配置文件,该配置文件包含如下配置信息 easy-okhttp.properties
,框架优先加载项目中的配置文件 HttpClient.INSTANCE.setConnectionTimeout(int)
HttpClient.INSTANCE.setReadTimeout(int)
HttpClient.INSTANCE.setCertificates(?)
HttpClient.INSTANCE.setDefaultHeader(String,String)
DefaultResponseConverter responseConverter = new DefaultResponseConverter(); HttpResponse<Response> httpResponse = HttpClient .get("http://localhost:8080/okhttp-server-test/userInfo/pageSelect") // 请求方式和请求url .execute(responseConverter);
String responseData = HttpClient .get("http://localhost:8080/okhttp-server-test/userInfo/pageSelect") // 请求方式和请求url .queryString("username","mzlion") //设置请求参数 .execute() .asString();
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();
String responseData = HttpClient .stringBody("http://localhost:8080/okhttp-server-test/userInfo/create") // 请求方式和请求url .json("{/"username/":/"mzlion/",/"userPwd/":/"123/"}") // post提交json //.xml("<?xml version=/"1.0/" encoding=/"utf-8/" ?>") //post提交xml //.html("function fun(){}") //post提交html //.charset("utf-8") //设置编码 .execute() .asString();
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();
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();
HttpResponse
类是对请求服务端的结果封装,包含了3个属性
isSuccess
表示请求是否成功 errorMessage
请求失败时错误消息 rawResponse
原始的 Response
,当框架提供的功能无法满足时候,可以调用该属性处理。 当请求执行完成之后一定需要判断请求成功还是失败 。** HttpResponse
类提供对请求服务端的结果转换方法
默认的请求响应结果并不能直接参与编程,一般都需要经过一些转换,所以 HttpResponse
对象提供了几种常见的转换,下面直接通过示例解释各个方法的作用和应用。
注意:当使用转换方法之前,最好调用方法 isSuccess()
判断请求响应是否成功,否则直接调用转换方法的话,如果响应失败,则会抛出'HttpClientException'异常
//将响应结果转为字符串输出 String responseData = httpResponse.asString(); //将响应结果转为文件保存 File frc = new File("d://web//save.txt"); httpResponse.asFile(frc); //json转换器 List<Person> personList = httpResponse.asBean(new TypeToken<List<Person>>(){}); //重载方法 //Person person = httpResponse.asBean(Person.class); //将响应结果转为输出流中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); httpResponse.asStream(baos);
当我们需要对单个请求设置连接超时时间、读取超时时间等属性时,可以在执行 execute
方法之前调用。主要有如下几个方法可以进行调用。
connectionTimeout(int)
连接超时时间 readTimeout(int)
读取超时时间 certificates([])
自定义签名证书设置 以上这些方法的调用会使得框架创建一个新的 OkHttpClient
对象。下面给出一个snippet加以说明。 //字符串转换器 String responseData = HttpClient.get() //设置请求方式 .url("http://localhost:8080/okhttp-server-test/userInfo/avatar2") //设置请求地址 .queryString("id","2") //设置请求参数 .readTimeout(30000) //覆盖设置,读取超时时间 .execute() //执行 .asString();
信任指定的自签名证书网站自签名网站htts访问处理方式非常简单,首先拿到客户端的签名证书,一般通过浏览器就可以导出xxx.cer证书了。然后将拿到的证书文件拷贝到自己的项目中,然后按照如下方式调用或设置。
//字符串转换器 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();
信任所有网站
该方法不推荐在生产环境使用,否则https的作用意义就失效了。信任所有网站的https访问设置非常简单, HttpClient.INSTANCE.setCertificates()
即可。
目前Demo还没完成,完成之后也会上传,方便大家直接把项目clone下来即可运行。