Forest是一个高层的、极简的声明式HTTP调用API框架 相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求
Forest有哪些特性?
以Httpclient和OkHttp为后端框架
通过调用本地方法的方式去发送Http请求, 实现了业务逻辑与Http协议之间 的解耦
因为针对第三方接口,所以不需要依赖Spring Cloud和任何注册中心
支持所有请求方法:GET, HEAD, OPTIONS,
TRACE, POST, DELETE, PUT, PATCH 支持文件上传和下载
支持灵活的模板表达式
支持拦截器处理请求的各个生命周期
支持自定义注解 支持OAuth2验证
支持过滤器来过滤传入的数据
基于注解、配置化的方式定义Http请求
支持Spring和Springboot集成
JSON格式数据序列化和反序列化
XML格式数据序列化和反序列化
Protobuf格式数据序列化和反序列化
JSON、XML或其他类型转换器可以随意扩展和替换
支持JSON转换框架: Fastjson, Jackson, Gson
支持JAXB形式的XML转换
可以通过OnSuccess和OnError接口参数实现请求结果的回调
配置简单,一般只需要@Request一个注解就能完成绝大多数请求的定义 支持异步请求调用
快速开始
直接添加以下maven依赖即可
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.26</version>
</dependency>
我这里以微信小程序登录调用接口为例
之前我们是这样写的
public static String httpRequest(String requestUrl, String requestMethod, String output) {
try {
URL url = new URL(requestUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod(requestMethod);
if (null != output) {
OutputStream outputStream = connection.getOutputStream();
outputStream.write(output.getBytes(StandardCharsets.UTF_8));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str;
StringBuilder buffer = new StringBuilder();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
connection.disconnect();
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
package com.wechat.wechat.miniprogram.service;
import com.alibaba.fastjson.JSONObject;
/**
* 微信小程序统一服务端API接口
* @author itveteran.jie@gmail.com
*/
public interface WxApi {
/**
* auth.code2Session
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
* 请求参数 属性 类型 默认值 必填 说明
* @param appId string 是 小程序 appId
* @param secret string 是 小程序 appSecret
* @param jsCode string 是 登录时获取的 code
* grantType string 是 授权类型,此处只需填写 authorization_code
* 返回值
* @return JSON 数据包
* 属性 类型 说明
* openid string 用户唯一标识
* session_key string 会话密钥
* unionid string 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明。
* errcode number 错误码
* errmsg string 错误信息
*
* errcode 的合法值
*
* 值 说明 最低版本
* -1 系统繁忙,此时请开发者稍候再试
* 0 请求成功
* 40029 code 无效
* 45011 频率限制,每个用户每分钟100次
*/
JSONObject authCode2Session(String appId,String secret,String jsCode);
}
进行调用
package com.wechat.wechat.miniprogram.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.wechat.wechat.miniprogram.service.WxMiniApi;
import com.wechat.wechat.utils.WeChatUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* 微信小程序Api接口实现类
*
* @author itveteran.jie@gmail.com
*/
@Slf4j
@Service
public class WxMiniApiImpl implements WxMiniApi {
@Override
public JSONObject authCode2Session(String appId, String secret, String jsCode) {
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + secret + "&js_code=" + jsCode + "&grant_type=authorization_code";
String str = WeChatUtil.httpRequest(url, "GET", null);
log.info("api/wx-mini/getSessionKey:" + str);
if (StringUtils.isEmpty(str)) {
return null;
} else {
return JSONObject.parseObject(str);
}
}
}
还可以使用其他的 进行编写调用
如果使用了 forest http 只需要一个接口
package com.wechat.forest.api;
import com.alibaba.fastjson.JSONObject;
import com.dtflys.forest.annotation.Get;
public interface WeChatTheApi {
/**
* 微信小程序登录
* @param appId 微信小程序AppId
* @param secret 微信小程序secret 密钥
* @param jsCode 临时登录凭证
* @return JSONObject
*/
@Get("https://api.weixin.qq.com/sns/jscode2session?appid=${0}&secret=${1}&js_code=${2}&grant_type=authorization_code")
JSONObject authCode2Session(String appId, String secret, String jsCode);
}
然后在启动类上面扫描
@ForestScan(basePackages = "com.wechat.forest.api")
如果就可以通过这个接口 注入 可以在 controller 以及业务层里面进行调用了 和我们正常调用一样的
更多内容请看官方文档
forest