当前位置: 首页 > 工具软件 > OkHttps > 使用案例 >

SpringBoot发送http请求--OkHttps

梁丘缪文
2023-12-01

最近做项目有一个需求,需要与其他公司对接,后端访问对方的接口,调用对方的资源。

经过多方考量,决定项目中引入OkHttps,来发起http请求。

OkHttps 是近期开源的对 OkHttp3 轻量封装的框架,它独创的异步预处理器,特色的标签,灵活的上传下载进度监听与过程控制功能,在轻松解决很多原本另人头疼问题的同时,设计上也力求纯粹与优雅。

  • 链式调用,一点到底
  • BaseURL、URL占位符、JSON自动封装与解析
  • 同步拦截器、异步预处理器、回调执行器、全局监听、回调阻断
  • 文件上传下载(过程控制、进度监听)
  • 单方法回调,充分利用 Lambda 表达式
  • TCP连接池、Http2   

下面开始整合

安装

#Maven

<dependency>
     <groupId>com.ejlchina</groupId>
     <artifactId>okhttps</artifactId>
     <version>1.0.5</version>
</dependency>

#Gradle

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();

#配置

#设置 BaseUrl

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

HttpResult是HTTP请求执行完后的结果,它是同步请求方法( getpostputdelete)的返回值,也是异步请求响应回调(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解析后的JavaBean
    • toList(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() 关闭报文,未对报文体做任何消费时使用,比如只读取长度

如果对您有帮助,帮忙点赞关注哦,谢谢!

官方文档:https://okhttps.ejlchina.com/v1/#maven

 类似资料: