在自动化脚本开发与设备管控场景中,冰狐自动化脚本SaaS平台 提供OpenAPI 接口体系,可让开发者在自有 后台服务中,无缝对接冰狐后端,实现设备管理、脚本调度、用户与卡密管控等核心能力,完成从 "单机脚本" 到 "云端集中管控" 的升级。本文将基于从接口认证、核心接口调用、Java Demo 实现、异常处理 全流程,详细讲解如何在 J自己的后台中调用 OpenAPI 获取所有设备列表 与单设备详细信息,使用java代码作为例子讲解。
二、冰狐智能辅助 SaaS OpenAPI 核心基础
2.1 接口整体规范
- 协议:HTTP/HTTPS
- 请求方式:GET/POST(以 GET 为主)
- 数据格式:统一返回 JSON,state=1 成功,state=-1 失败
- 响应格式:
javascript
{
"state": 1,
"data": { ... }
}
2.2 核心认证流程
所有业务接口(设备、用户、脚本等)均需accessToken鉴权,获取流程:
- 用clientKey+clientSecret 调用
/api/get_token获取accessToken (访问凭证)+refreshToken(刷新凭证) - accessToken 过期后,用
refreshToken+clientKey调用/api/refresh_token刷新,避免重复获取 token 被拉黑 IP - 禁止频繁调用
get_token,否则系统自动拉黑 IP
2.3 本文核心接口
| 接口名称 | 请求地址 | 核心作用 |
|---|---|---|
| 获取 Token | GET /api/get_token | 获取访问凭证 |
| 刷新 Token | GET /api/refresh_token | 刷新过期凭证 |
| 获取设备列表 | GET /api/device/list | 获取所有 / 指定用户设备 |
| 获取设备信息 | GET /api/device/get_info | 获取单设备详细信息 |
三、开发环境准备
3.1 依赖引入(Maven)
基于 SpringBoot+OkHttp+FastJSON2 实现,轻量高效,无冗余依赖:
XML
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.15</version>
</dependency>
<!-- OkHttp 网络请求 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<!-- FastJSON2 序列化 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.32</version>
</dependency>
<!-- 工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
3.2 核心配置
在application.yml配置冰狐 OpenAPI 基础信息,替换为自己的开发者密钥:
binghu:
# 基础域名
base-url: https://aznfz.com
# 开发者Key(冰狐后台获取)
client-key: your_client_key
# 开发者Secret(冰狐后台获取)
client-secret: your_client_secret
# 请求超时时间
connect-timeout: 10000
# 读取超时时间
read-timeout: 30000
四、核心实体封装
4.1 通用响应实体
java
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;
/**
* 冰狐OpenAPI通用响应
*/
@Data
public class BingHuResponse<T> {
/**
* 状态:1成功 -1失败
*/
private Integer state;
/**
* 响应数据
*/
private T data;
/**
* 判断是否成功
*/
public boolean isSuccess() {
return 1 == this.state;
}
}
4.2 设备信息实体
java
import lombok.Data;
/**
* 冰狐设备信息
*/
@Data
public class DeviceInfo {
/**
* 设备唯一标识
*/
private String uuid;
/**
* 设备名称
*/
private String name;
/**
* 设备手机号
*/
private String phoneNumber;
/**
* 自定义数据
*/
private String extraData;
/**
* 是否可用
*/
private Boolean enable;
/**
* 可用天数
*/
private Integer days;
/**
* 在线状态:0离线 1在线 2在线但服务不可用
*/
private Integer onlineState;
/**
* 工作状态:0空闲 1繁忙
*/
private Integer workState;
/**
* 开发模式:0开发 1发布
*/
private Integer devState;
}
4.3 设备列表响应
java
import lombok.Data;
import java.util.List;
/**
* 设备列表响应
*/
@Data
public class DeviceListResponse {
/**
* 设备列表
*/
private List<DeviceInfo> list;
/**
* 总数量
*/
private Integer total;
}
4.4 Token 响应
java
import lombok.Data;
/**
* Token响应
*/
@Data
public class TokenResponse {
/**
* 访问Token
*/
private String accessToken;
/**
* 刷新Token
*/
private String refreshToken;
/**
* 过期时间(秒)
*/
private Integer expiresIn;
}
五、核心工具类封装
5.1 OkHttp 客户端配置
java
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
* OkHttp配置
*/
@Configuration
public class OkHttpConfig {
@Value("${binghu.connect-timeout}")
private Integer connectTimeout;
@Value("${binghu.read-timeout}")
private Integer readTimeout;
@Bean
public OkHttpClient okHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
.readTimeout(readTimeout, TimeUnit.MILLISECONDS)
.build();
}
}
5.2 冰狐 API 核心调用工具
java
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* 冰狐智能辅助API工具
*/
@Component
public class BingHuApiUtil {
@Value("${binghu.base-url}")
private String baseUrl;
@Value("${binghu.client-key}")
private String clientKey;
@Value("${binghu.client-secret}")
private String clientSecret;
@Resource
private OkHttpClient okHttpClient;
// 缓存Token(生产环境建议存入Redis)
private String accessToken;
private String refreshToken;
/**
* 1. 获取Token(核心认证)
*/
public BingHuResponse<TokenResponse> getToken() {
String url = baseUrl + "/api/get_token";
Map<String, String> params = new HashMap<>(2);
params.put("clientKey", clientKey);
params.put("clientSecret", clientSecret);
BingHuResponse<TokenResponse> response = doGet(url, params, new TypeReference<BingHuResponse<TokenResponse>>() {});
if (response.isSuccess()) {
// 缓存Token
TokenResponse data = response.getData();
this.accessToken = data.getAccessToken();
this.refreshToken = data.getRefreshToken();
}
return response;
}
/**
* 2. 刷新Token
*/
public BingHuResponse<TokenResponse> refreshToken() {
String url = baseUrl + "/api/refresh_token";
Map<String, String> params = new HashMap<>(2);
params.put("clientKey", clientKey);
params.put("refreshToken", refreshToken);
BingHuResponse<TokenResponse> response = doGet(url, params, new TypeReference<BingHuResponse<TokenResponse>>() {});
if (response.isSuccess()) {
TokenResponse data = response.getData();
this.accessToken = data.getAccessToken();
this.refreshToken = data.getRefreshToken();
}
return response;
}
/**
* 3. 获取设备列表(所有设备)
*/
public BingHuResponse<DeviceListResponse> getDeviceList() {
String url = baseUrl + "/api/device/list";
Map<String, String> params = new HashMap<>(2);
params.put("clientKey", clientKey);
params.put("accessToken", accessToken);
// 默认获取管理者所有设备,cursor=0,count=-1返回全部
return doGet(url, params, new TypeReference<BingHuResponse<DeviceListResponse>>() {});
}
/**
* 4. 获取单设备详细信息
*/
public BingHuResponse<DeviceInfo> getDeviceInfo(String uuid) {
String url = baseUrl + "/api/device/get_info";
Map<String, String> params = new HashMap<>(3);
params.put("clientKey", clientKey);
params.put("accessToken", accessToken);
params.put("uuid", uuid);
return doGet(url, params, new TypeReference<BingHuResponse<DeviceInfo>>() {});
}
/**
* 通用GET请求
*/
private <T> BingHuResponse<T> doGet(String url, Map<String, String> params, TypeReference<BingHuResponse<T>> typeReference) {
try {
// 拼接参数
StringBuilder sb = new StringBuilder(url);
if (params != null && !params.isEmpty()) {
sb.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
sb.deleteCharAt(sb.length() - 1);
}
Request request = new Request.Builder()
.url(sb.toString())
.get()
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new RuntimeException("请求失败,状态码:" + response.code());
}
String body = response.body().string();
return JSON.parseObject(body, typeReference);
}
} catch (Exception e) {
BingHuResponse<T> error = new BingHuResponse<>();
error.setState(-1);
error.setData(null);
e.printStackTrace();
return error;
}
}
/**
* 初始化Token(项目启动时调用)
*/
public void initToken() {
if (StrUtil.isBlank(accessToken)) {
getToken();
}
}
}
六、完整 Demo 实现
6.1 启动类初始化 Token
java
import com.example.binghu.util.BingHuApiUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.Resource;
@SpringBootApplication
public class BingHuApiDemoApplication {
@Resource
private BingHuApiUtil bingHuApiUtil;
public static void main(String[] args) {
SpringApplication.run(BingHuApiDemoApplication.class, args);
}
/**
* 项目启动后初始化Token
*/
@javax.annotation.PostConstruct
public void init() {
bingHuApiUtil.initToken();
}
}
6.2 控制层提供接口
java
import com.example.binghu.entity.BingHuResponse;
import com.example.binghu.entity.DeviceInfo;
import com.example.binghu.entity.DeviceListResponse;
import com.example.binghu.util.BingHuApiUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 冰狐设备管理接口
*/
@RestController
@RequestMapping("/binghu/device")
public class BingHuDeviceController {
@Resource
private BingHuApiUtil bingHuApiUtil;
/**
* 获取所有设备列表
*/
@GetMapping("/list")
public BingHuResponse<DeviceListResponse> getDeviceList() {
return bingHuApiUtil.getDeviceList();
}
/**
* 获取单设备信息
*/
@GetMapping("/info/{uuid}")
public BingHuResponse<DeviceInfo> getDeviceInfo(@PathVariable String uuid) {
return bingHuApiUtil.getDeviceInfo(uuid);
}
/**
* 刷新Token
*/
@GetMapping("/refreshToken")
public BingHuResponse<TokenResponse> refreshToken() {
return bingHuApiUtil.refreshToken();
}
}
6.3 测试结果
- 启动项目,访问
https://aznfz.com/api/device/list,返回所有设备列表:
javascript
{
"state": 1,
"data": {
"list": [
{
"uuid": "device_001",
"name": "测试设备1",
"phoneNumber": "13800138000",
"extraData": "{\"remark\":\"测试专用\"}",
"enable": true,
"days": 365,
"onlineState": 1,
"workState": 0,
"devState": 1
}
],
"total": 1
}
}
- 访问
https://aznfz.com/api/device/info/device_001,返回单设备详细信息。
七、生产环境关键注意事项
7.1 Token 缓存与刷新
- 本文用内存缓存 Token,生产环境必须存入 Redis,设置过期时间(比 expiresIn 提前 5 分钟)
- 调用业务接口时,捕获 token 过期异常,自动调用
refreshToken重试
7.2 IP 防拉黑
- 严禁频繁调用
/api/get_token,官方明确会自动拉黑 IP - 优先用
refreshToken刷新,减少get_token调用次数
7.3 参数编码
- 接口中
uuids、params等 JSON 数组参数,必须调用 encodeURI 编码,避免参数解析失败
7.4 异常处理
- 增加网络超时、参数错误、token 失效、设备不存在等异常捕获
- 接口调用失败时,记录日志并返回友好提示
7.5 权限管控
clientKey和clientSecret属于核心密钥,严禁硬编码在代码中,通过配置中心 / 环境变量管理- 限制接口访问权限,避免未授权调用
八、扩展能力
基于本文封装的工具类,可快速扩展冰狐 OpenAPI 其他核心能力:
- 设备控制:启动 / 停止设备、执行设备端脚本
- 用户管理:创建用户、用户登录、获取用户列表
- 卡密管理:创建卡密、获取卡密列表、转移卡密
- 脚本调度:执行后端脚本、调用微服务
九、总结
本文基于冰狐智能辅助官方 OpenAPI 文档,完成了Java 后台调用 OpenAPI 获取设备列表与设备信息 的全流程实现,从接口规范、实体封装、核心工具、Demo 代码 到生产注意事项 ,覆盖开发全场景。通过这套方案,开发者可将冰狐智能辅助的设备管控能力,无缝集成到自有 Java 后台,实现自动化脚本的云端集中管理,轻松支撑规模化自动化业务。