函数插件
对于云端函数,可以选择上传插件,插件本质即Js函数,在配置领域函数时通过关联相关的插件,可以实现对领域函数调用前,调用时,调用后的扩展。
Js函数的格式由平台定义,内容由用户自己实现。
平台目前约定了三种类型的插件,分别为鉴权插件、驱动插件、格式插件。
命名规则:。插件的命名规则为:{插件名称}-{插件类型}.{文件后缀},且“插件名称”中不能包含“-”。
插件类型 | 功能 | 命名规则 |
鉴权插件 | http请求的前置处理,例如添加请求头 | xxx-鉴权插件.js |
格式插件 | http请求的后置处理,流入修改返回值的数据结构 | xxx-格式插件.js |
驱动插件 | 用于自定义请求协议(默认为http协议) | xxx-驱动插件.js |
编写规则:遵循JavaScript语法和JAVA脚本引擎规则,借助平台已提供的Js函数库和Java基础类/静态工具方法,详情请在下文查阅。
|- 鉴权插件
用户可通过编写鉴权插件的函数代码对原始请求的请求头和请求参数进行增强,比如添加、修改或删除请求头和请求参数
Js函数
function authPlugin(authRequest)
入参
属性 | 类型 | 说明 | 例子 |
authRequest | Object | 封装了请求所传的请求头和请求参数 | {"headers": [], "params": []} |
authRequest的结构
属性 | 类型 | 说明 | 例子 |
headers | Array | authRequest属性,请求头本质:org.springframework.util.MultiValueMap类 | [{"Content-Type":"application/json"},{"Content-Length":"1"},...] |
params | Array | authRequest属性,请求参数本质:org.springframework.util.MultiValueMap类 | [{"name1":"value1"},{"name2":"value2"},...] |
方法 | 入参 | 返回值 | 说明 |
getHeaders() | 无 | headers属性 | 获取请求头 |
getParams() | 无 | params属性 | 获取请求参数 |
返回值
无
例子
function authPlugin(authRequest){
var headers = authRequest.getHeaders();
headers.set("Authorization", "bearer XXX");
}
|- 驱动插件
可以替换领域函数,即当调用的领域函数存在驱动插件时,将转而执行驱动插件,而不会调用领域函数;同时比较灵活还可以囊括其它插件的功能
Js函数
function driverPlugin(request)
入参
属性 | 类型 | 说明 | 例子 |
request | Object | 驱动插件入参本质:javax.servlet.http.HttpServletRequest类 | https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html |
返回值
可返回任意类型,由用户编写插件的函数代码决定。
例子
function driverPlugin(request) {
// 调用java工具类从request中获取请求头
var headerMap = HttpUtil.buildHeader(request);
// 请求头中写入token
headerMap.set("Authorization", "Basic bW9iaWxlLWNsaWVudDptb2JpbGUtc2VjcmV0");
// 实例化java MultiValueMap类
var multiValueMap = new MultiValueMap();
multiValueMap.set("grant_type", "password");
multiValueMap.set("scope", "read");
multiValueMap.set("username", "rachel");
multiValueMap.set("password", "Ut123456");
multiValueMap.set("accountSystemKey", "defat");
// 调用平台提供的js函数库 http相关函数发起登录请求获取token
var result = httpPost("https://dev.utyun.com/uaa/oauth/login", headerMap, multiValueMap, true);
// 使用Java fastJson JSON类解析json
var jsonObject = JSON.parseObject(result.body);
var token = jsonObject.getString("access_token");
// 调用java工具类从request中获取请求头
var headerMap2 = HttpUtil.buildHeader(request);
// 请求头中写入token
headerMap2.set("Authorization", "bearer " + token);
// 调用java工具类从request中获取请求体
var paramObj = HttpUtil.parseRequestBody(request);
// 调用平台提供的js函数库 http相关函数发起硬件云iot相关请求
var result2 = httpPost("https://dev.utyun.com/api/iotapp/device/setDeviceProperty", headerMap2, null, paramObj, false):
return JSON.parse(result2.body);
}
|- 格式插件
对领域函数调用的结果重新进行封装后再返回
Js函数
function formatPlugin(inputData)
入参
属性 | 类型 | 说明 | 例子 |
inputData | Object | 封装了领域函数调用的结果:响应状态码和响应内容 | { "statusCode": 200, "responseBody": "数据"} |
inputData的结构
属性 | 类型 | 说明 | 例子 |
statusCode | number | inputData属性,响应状态码 | 200、500 |
responseBody | string | inputData属性,响应内容 | "XXX" |
方法 | 入参 | 返回值 | 说明 |
getStatusCode() | 无 | statusCode属性 | 获取响应状态码 |
getResponseBody() | 无 | responseBody属性 | 获取响应内容 |
返回值
属性 | 类型 | 说明 | 例子 |
statusCode | number | 响应状态码,由用户编写的函数代码决定最终将作为领域函数调用的请求响应码 | 200、500 |
utData | Object | 数据,由用户编写的函数代码决定最终将作为领域函数调用的请求响应正常时的响应数据 | {"utData": "", "utCode":200} |
utError | Object | 错误信息,由用户编写的函数代码决定最终将作为领域函数调用的请求响应异常时的响应数据 | {"utService":"","utCode":1,"utMsg":""} |
例子
function formatPlugin(inputData) {
// 实例化java的FormatPluginOutputVO类作为返回结果
var outputData = new FormatPluginOutputVO();
if (inputData.statusCode === 200) {
print(inputData);
outputData.setStatusCode(200);
// 通过java BusinessResponseVO构建成功结果数据
outputData.setUtData(BusinessResponseVO.success(inputData.getResponseBody()));
} else {
var utData = JSON.parse(inputData.getResponseBody());
// 实例化java的UtErrorInfo类
var utError = new UtErrorInfo();
utError.setUtMsg(utData.message);
utError.setUtCode(utData.status);
utError.setUtService(utData.path);
outputData.setUtError(utError);
outputData.setStatusCode(500);
}
return outputData;
}