最近做项目有一个需求,需要与其他公司对接,后端访问对方的接口,调用对方的资源。
经过多方考量,决定项目中引入OkHttps,来发起http请求。
OkHttps 是近期开源的对 OkHttp3 轻量封装的框架,它独创的异步预处理器,特色的标签,灵活的上传下载进度监听与过程控制功能,在轻松解决很多原本另人头疼问题的同时,设计上也力求纯粹与优雅。
<dependency>
<groupId>com.ejlchina</groupId>
<artifactId>okhttps</artifactId>
<version>1.0.5</version>
</dependency>
implementation 'com.ejlchina:okhttps:1.0.5'
安卓中使用需要把 JDK 版本调成 1.8,在 app 模块的 build.gradle 中加入以下配置即可:
android {
// 省略其它配置..
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
HTTP http = HTTP.builder().build();
HTTP http = HTTP.builder()
.baseUrl("http://api.demo.com") // 设置 BaseUrl
.build();
该配置全局生效,在配置了BaseUrl
之后,具体的请求便可以省略BaseUrl
部分,使得代码更加简洁,
例如:
http.sync("/users").get() // http://api.demo.com/users
http.sync("/auth/signin") // http://api.demo.com/auth/signin
.addBodyParam("username", "Jackson")
.addBodyParam("password", "xxxxxx")
.post(); // POST请求
在配置了BaseUrl
之后,如有特殊请求任务,仍然可以使用全路径的方式,一点都不妨碍:
http.sync("https://www.baidu.com").get();
以上代码构建了一个最简单的HTTP
实例,它拥有以下方法:
sync(String url)
开始一个同步请求async(String url)
开始一个异步请求cancel(String tag)
按标签取消请求cancelAll()
取消所有HTTP任务,包括同步和异步request(Request request)
OkHttp 原生请求webSocket(Request request, WebSocketListener listener)
WebSocket通讯为了使用方便,在构建的时候,我们更愿意指定一个BaseUrl
(详见 设置 BaseUrl):
使用方法sync(String url)
开始一个同步请求:
List<User> users = http.sync("/users") // http://api.demo.com/users
.get() // GET请求
.getBody() // 获取响应报文体
.toList(User.class); // 得到目标数据
方法sync
返回一个同步HttpTask
,可链式使用。
使用方法async(String url)
开始一个异步请求:
http.async("/users/1") // http://api.demo.com/users/1
.setOnResponse((HttpResult result) -> {
// 得到目标数据
User user = result.getBody().toBean(User.class);
})
.get(); // GET请求
我们可以新建一个Mapper来接收响应,这样就不用新建实体类来接收了
Mapper mapper = OkHttps.sync(urlTicket + ticket).get().getBody().toMapper();//用mapper接收
if (!Func.equals(mapper.getString("Type"), "1")) {
throw new TicketValidateException(TokenUtil.TICKET_VALIDATE_FAILED);
}
HttpResult
是HTTP请求执行完后的结果,它是同步请求方法( get
、post
、put
、delete
)的返回值,也是异步请求响应回调(OnResponse
)的参数,它定义了如下方法:
getState()
得到请求执行状态枚举,它有以下取值:
State.CANCELED
请求被取消State.RESPONSED
已收到响应State.TIMEOUT
请求超时State.NETWORK_ERROR
网络错误State.EXCEPTION
其它请求异常getStatus()
得到HTTP状态码isSuccessful()
是否响应成功,状态码在 [200..300) 之间getHeaders()
得到HTTP响应头getHeaders(String name)
得到HTTP响应头getHeader(String name)
得到HTTP响应头getBody()
得到响应报文体Body
实例,它定义了如下方法(对同一个Body
实例,以下的toXXX()
类方法只能使用一个且仅能调用一次,除非先使用 cache 方法):
toBytes()
返回字节数组toByteStream()
返回字节输入流toCharStream()
返回字符输入流toString()
返回字符串toJsonObject()
返回Json对象toJsonArray()
返回Json数组toBean(Class<T> type)
返回根据type自动json解析后的JavaBeantoList(Class<T> type)
返回根据type自动json解析后的JavaBean列表toFile(String filePath)
下载到指定路径toFile(File file)
下载到指定文件toFolder(String dirPath)
下载到指定目录toFolder(File dir)
下载到指定目录getContentType()
返回报文体的媒体类型getContentLength()
返回报文体的字节长度cache()
缓存报文体,开启缓存后可重复使用toXXX()
类方法close()
关闭报文体,未对报文体做任何消费时使用,比如只读取报文头getError()
执行中发生的异常,自动捕获执行请求时发生的 网络超时、网络错误 和 其它IO异常close()
关闭报文,未对报文体做任何消费时使用,比如只读取长度