一、FaaS介绍
(一)FaaS 核心概念
FaaS(函数即服务)是基于 Serverless 架构推出的核心能力,开发者无需管理服务器、集群扩容等运维工作,仅通过编写 JS 脚本即可实现后端业务逻辑,具备高并发、模块化、免运维的优势。FaaS 支持数据库访问、设备调度、自定义业务扩展等场景,是连接前端自动化脚本与后端复杂逻辑的核心桥梁。
(二)服务端接口定位
冰狐 FaaS 提供两类核心调用入口:移动端接口(callMicroService)与服务端接口(Open API)。服务端接口面向第三方 Java/Python/Go 等后端服务,通过 HTTP 请求远程调用冰狐 FaaS 脚本,实现跨平台、跨系统的业务联动。其核心价值在于:
- 无需改造冰狐现有 SaaS 能力,快速扩展定制化后端逻辑;
- 第三方系统可直接调用冰狐设备管理、数据存储、脚本调度等能力;
- 基于鉴权机制保障接口调用安全,支持参数透传与结果返回。
(三)接口基础信息
- 请求地址 :
https://aznfz.com/api/call_micro_service - 请求方式:GET/POST(推荐 POST,支持复杂参数)
- 鉴权参数 :
clientKey(开发者密钥)、accessToken(访问令牌) - 核心参数 :
name:FaaS 脚本名称(必填);functionName:脚本执行函数(默认main,选填);isDev:是否开发环境(布尔值,选填);params:透传 FaaS 脚本的参数(JSON 数组字符串,选填)。
二、服务端接口调用流程
(一)前置准备
- 注册冰狐账号:登录冰狐智能辅助平台。
- 创建 FaaS 脚本 :进入平台「FaaS」→「FaaS 脚本」,新建 JS 脚本(如
server_demo),编写业务逻辑(参考下文冰狐 JS Demo)。 - 获取鉴权信息 :在平台「个人中心」→「开发者设置」,复制
clientKey,通过账号密码调用冰狐鉴权接口获取accessToken。
(二)调用全流程
- 第三方 Java 后端发起 HTTP 请求,携带鉴权参数与 FaaS 脚本信息;
- 冰狐平台校验
clientKey与accessToken合法性; - 校验通过后,解析
params参数并透传给指定 FaaS 脚本的目标函数; - FaaS 脚本执行业务逻辑(如数据库查询、设备调度),将结果返回给 Java 后端;
- Java 后端接收结果并完成后续业务处理(如数据存储、结果转发)。
三、冰狐 FaaS 脚本开发(JS Demo 源码)
(一)基础示例:参数接收与结果返回
该脚本接收服务端接口透传的name与value参数,拼接后返回,用于基础连通性测试。
javascript
// 文件名:server_demo.js(FaaS脚本名称,调用时需对应)
// 默认入口函数main,参数与服务端传入的params数组一一对应
function main(name = "", value = 1) {
// 打印日志(平台「FaaS日志」可查看)
console.log("服务端传入参数:name=" + name + ",value=" + value);
// 业务逻辑:参数拼接
const result = "接收成功:" + name + "-" + value;
// 返回结果(透传给Java后端)
return {
code: 200,
msg: "执行成功",
data: result
};
}
(二)进阶示例:数据库查询与设备数据返回
该脚本接收设备uuid参数,查询冰狐平台数据库中对应设备的信息并返回,适用于设备数据联动场景。
javascript
// 文件名:device_query.js
function main(deviceUuid = "") {
console.log("查询设备参数:uuid=" + deviceUuid);
// 1. 参数校验
if (!deviceUuid) {
return {
code: 400,
msg: "设备uuid不能为空",
data: null
};
}
// 2. 数据库查询(冰狐内置dbQuery函数,参数:表名、字段、条件)
// 示例:查询device表中uuid匹配的设备名称、在线状态
const deviceList = dbQuery(
"device",
"name,online_state,create_time",
[`uuid='${deviceUuid}'`]
);
// 3. 结果处理
if (deviceList && deviceList.length > 0) {
return {
code: 200,
msg: "设备查询成功",
data: deviceList[0] // 返回单个设备信息
};
} else {
return {
code: 404,
msg: "设备不存在",
data: null
};
}
}
(三)脚本发布与验证
- 编写完成后,在冰狐平台点击「保存」→「发布」脚本;
- 进入「FaaS 日志」,确认脚本无语法错误;
- 记录脚本名称(如
device_query),用于 Java 后端调用。
四、Java 后端调用服务端接口(Demo 源码)
(一)依赖引入(Maven)
Java 后端通过OkHttp发送 HTTP 请求,Fastjson2解析 JSON 数据,pom.xml 引入依赖:
XML
<!-- HTTP请求工具 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- JSON解析工具 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.48</version>
</dependency>
(二)核心工具类:接口调用封装
封装冰狐服务端接口的 HTTP 请求逻辑,包含鉴权参数拼接、POST 请求发送、结果解析。
java
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import okhttp3.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* 冰狐FaaS服务端接口调用工具类
*/
public class BingHuFaaSClient {
// 冰狐服务端接口地址
private static final String BASE_URL = "https://aznfz.com/api/call_micro_service";
// 开发者clientKey(替换为自己的)
private static final String CLIENT_KEY = "your_client_key";
// 访问token(替换为自己的,可通过鉴权接口动态获取)
private static final String ACCESS_TOKEN = "your_access_token";
// OkHttp客户端
private static final OkHttpClient HTTP_CLIENT = new OkHttpClient();
/**
* 调用冰狐FaaS服务端接口
* @param scriptName FaaS脚本名称
* @param functionName 执行函数(默认main,可传null)
* @param params 透传参数(JSON数组,如["测试",123])
* @return 接口返回结果
*/
public static JSONObject callFaaS(String scriptName, String functionName, Object[] params) {
try {
// 1. 拼接请求URL(GET参数:鉴权信息、脚本信息)
StringBuilder urlBuilder = new StringBuilder(BASE_URL);
urlBuilder.append("?clientKey=").append(URLEncoder.encode(CLIENT_KEY, StandardCharsets.UTF_8.name()));
urlBuilder.append("&accessToken=").append(URLEncoder.encode(ACCESS_TOKEN, StandardCharsets.UTF_8.name()));
urlBuilder.append("&name=").append(URLEncoder.encode(scriptName, StandardCharsets.UTF_8.name()));
// 非默认函数时添加
if (functionName != null && !functionName.isEmpty()) {
urlBuilder.append("&functionName=").append(URLEncoder.encode(functionName, StandardCharsets.UTF_8.name()));
}
urlBuilder.append("&isDev=false"); // 生产环境
// 2. 处理请求参数(params转为JSON字符串)
String paramsJson = params != null ? JSON.toJSONString(params) : "[]";
// POST请求体:params
RequestBody requestBody = RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
paramsJson
);
// 3. 构建POST请求
Request request = new Request.Builder()
.url(urlBuilder.toString())
.post(requestBody)
.build();
// 4. 发送请求并解析结果
try (Response response = HTTP_CLIENT.newCall(request).execute()) {
if (!response.isSuccessful()) {
return buildErrorResult("请求失败,状态码:" + response.code());
}
String responseBody = response.body().string();
return JSON.parseObject(responseBody);
}
} catch (IOException e) {
e.printStackTrace();
return buildErrorResult("请求异常:" + e.getMessage());
}
}
/**
* 构建错误结果
*/
private static JSONObject buildErrorResult(String msg) {
JSONObject errorResult = new JSONObject();
errorResult.put("code", 500);
errorResult.put("msg", msg);
errorResult.put("data", null);
return errorResult;
}
// 测试调用
public static void main(String[] args) {
// 示例1:调用基础脚本server_demo,参数:["测试设备",123]
JSONObject result1 = callFaaS("server_demo", null, new Object[]{"测试设备", 123});
System.out.println("基础脚本调用结果:" + result1);
// 示例2:调用设备查询脚本device_query,参数:["设备uuid"]
JSONObject result2 = callFaaS("device_query", null, new Object[]{"your_device_uuid"});
System.out.println("设备查询脚本调用结果:" + result2);
}
}
(三)代码说明
- 鉴权配置 :
CLIENT_KEY与ACCESS_TOKEN需替换为个人账号对应的信息,accessToken有效期建议通过定时任务刷新; - 参数处理 :
params为 JSON 数组,与 FaaS 脚本main函数参数一一对应,复杂对象需转为 JSON 字符串; - 结果解析 :接口返回 JSON 格式数据,包含
code(状态码)、msg(提示信息)、data(返回数据),可根据code判断执行结果。
五、常见问题与最佳实践
(一)常见报错排查
- 401 鉴权失败 :
clientKey或accessToken错误,检查开发者配置;accessToken过期,重新调用鉴权接口获取。 - 404 脚本不存在:FaaS 脚本名称错误,或脚本未发布,核对脚本名称并重新发布。
- 500 脚本执行异常:JS 脚本语法错误,或数据库 / 设备 API 调用失败,查看平台「FaaS 日志」定位问题。
- 参数不匹配 :Java 传入的
params数组长度、类型与 FaaS 脚本main函数参数不一致,核对参数定义。
(二)最佳实践
- 参数校验:FaaS 脚本中优先校验入参合法性,避免无效数据库查询或设备调用。
- 日志规范:关键节点打印日志(参数、执行结果、异常信息),便于问题排查。
- 异步调用:Java 后端调用耗时较长的 FaaS 脚本时,采用异步线程或消息队列,避免阻塞主线程。
- 权限控制 :
clientKey与accessToken严格保密,避免硬编码,建议通过配置中心或环境变量存储。 - 超时设置:HTTP 请求设置合理超时时间(5-10 秒),避免长时间等待无响应的接口。
六、总结
冰狐智能辅助平台的 FaaS 服务端接口,为第三方 Java 后端提供了低成本、高效率的冰狐能力接入方案。通过本文的 JS 脚本开发、Java 调用示例及问题排查方案,开发者可快速实现跨系统业务联动、设备数据管理、自定义后端逻辑扩展等场景。