Function编写示例
概述
Function是按照限定格式编写的一段代码。开发者上传代码至DUI平台,DUI平台自动将该代码部署为HTTP服务,作为技能的一种数据资源,供DUI平台的其他服务调用。
输入输出
作为数据资源的一种,Function的输入输出需要遵守数据资源的通用格式。
支持语言
Node.js 6、Python 2.7
event
event是调用Function时传入的参数,Node.js环境event为Buffer类型,Python环境event为string。由于数据资源的输入输出为json字符,故参数需要调用相应环境的json库解析获取。
Node.js
函数签名
函数签名限定为exports.handler = function(event, context, callback)
exports.handler = function(event, context, callback) {
//event = "{'duiWidget': 'custom', 'key1': 'value1', 'key2': 'value2'}"
var input = JSON.parse(event.toString());
console.log("duiWidget = " + input.duiWidget);
console.log("value1 = " + input.key1);
console.log("value1 = " + input.key1);
console.log("value2 = " + input.key2);
// callback第一个参数是Error类型,null表示函数成功执行
//callback(null, "some success message");
// or
// callback("some error type");
var res = {
'duiWidget': input.duiWidget,
'weather': '暴雨'
};
callback(null, JSON.stringify(res));
}
callback函数
函数签名为callback(Error error, Object response)
Node.js使用异步编程,需要通过调用callback来返回数据或者错误。callback被调用后函数就会停止运行,重复调用callback只接受第一次调用的结果,确保所有任务在callback调用之前完成。
callback示例:
callback(null, "{'text': '明天会下雨'}"); // 函数执行成功,返回"{'text': '明天会下雨'}"
callback(new Error("error")); // 函数执行失败
示例
列表控件
exports.handler = function(event, context, callback) {
const input = JSON.parse(event.toString());
var duiWidget = input.duiWidget;
var res = {
"duiWidget": "list",
"count": 2,
"content": [
{
"title": "独墅湖图书馆东",
"parameters": {
"L": 123.3,
"H": 323.4
}
},
{
"title": "独墅湖图书馆南",
"parameters": {
"L": 33213.1,
"H": 666.3
}
}],
"extra": {
"key1": "value1",
"key2": "value2"
}
};
callback(null, JSON.stringify(res));
}
内容卡片控件
exports.handler = function(event, context, callback) {
const input = JSON.parse(event.toString());
var duiWidget = input.duiWidget;
var res ={
"duiWidget": "content",
"title": "card-title",
"subTitle": "card-sub-title",
"label": "card-label",
"imageUrl": "URL of the image to be shown",
"linkUrl": "URL of the attribute to be associated with the card",
"parameters": {
"key1": "val1",
"key2": "val2"
},
"extra": {
"key1": "val1",
"key2": "val2"
}
};
callback(null, JSON.stringify(res));
}
内嵌网页控件
exports.handler = function(event, context, callback) {
const input = JSON.parse(event.toString());
var duiWidget = input.duiWidget;
var res = {
"duiWidget": "web",
"url": "URL of the web widget",
"extra": {
"key1": "val1",
"key2": "val2"
}
};
callback(null, JSON.stringify(res));
}
多媒体控件
exports.handler = function(event, context, callback) {
const input = JSON.parse(event.toString());
var duiWidget = input.duiWidget;
var res = {
"duiWidget": "media",
"widgetName": "音乐播放",
"count": 2,
"content": [
{
"title": "忘情水",
"subTitle": "来生缘",
"label":"刘德华",
"imageUrl":"https://liu-de-hua.png",
"linkUrl":"https://wang-qing-shui.mp3",
"extra": {
"resType": "mp3"
}
},
{
"title": "爱你一万年",
"subTitle": "来生缘",
"label":"刘德华",
"imageUrl":"https://liu-de-hua.png",
"linkUrl":"https://ai-ni-yi-wan-nian.wav",
"extra": {
"resType": "wav"
}
}]
};
callback(null, JSON.stringify(res));
}
自定义控件
exports.handler = function(event, context, callback) {
const input = JSON.parse(event.toString());
var duiWidget = input.duiWidget;
var res = {"duiWidget": "text", "text": "今天不用带伞", "extra": { "key1": "val1", "key2": "val2"}};
callback(null, JSON.stringify(res));
}
Python
函数签名
函数签名限定为def handler(event, context)
:
import json
def handler(event, context):
input = json.loads(event)
value1 = input['key1']
value2 = input['key2']
return json.dumps({
'duiWidget': input.duiWidget,
'weather': '暴雨'
})
示例
列表控件
# -*- coding: utf-8 -*-
import json
def handler(event, context):
input = json.loads(event)
return json.dumps({
"duiWidget": "list",
"count": 2,
"content": [
{
"title": "独墅湖图书馆东",
"parameters": {
"L": 123.3,
"H": 323.4
}
},
{
"title": "独墅湖图书馆南",
"parameters": {
"L": 33213.1,
"H": 666.3
}
}],
"extra": {
"key1": "value1",
"key2": "value2"
}
})
内容卡片控件
# -*- coding: utf-8 -*-
import json
def handler(event, context):
input = json.loads(event)
return json.dumps({
"duiWidget": "content",
"title": "card-title",
"subTitle": "card-sub-title",
"label": "card-label",
"imageUrl": "URL of the image to be shown",
"linkUrl": "URL of the attribute to be associated with the card",
"parameters": {
"key1": "val1",
"key2": "val2"
},
"extra": {
"key1": "val1",
"key2": "val2"
}
})
内嵌网页控件
# -*- coding: utf-8 -*-
import json
def handler(event, context):
input = json.loads(event)
return json.dumps({
"duiWidget": "web",
"url": "URL of the web widget",
"extra": {
"key1": "val1",
"key2": "val2"
}
})
多媒体控件
# -*- coding: utf-8 -*-
import json
def handler(event, context):
input = json.loads(event)
return json.dumps({
"duiWidget": "media",
"widgetName": "音乐播放",
"count": 2,
"content": [
{
"title": "忘情水",
"subTitle": "来生缘",
"label":"刘德华",
"imageUrl":"https://liu-de-hua.png",
"linkUrl":"https://wang-qing-shui.mp3",
"extra": {
"resType": "mp3"
}
},
{
"title": "爱你一万年",
"subTitle": "来生缘",
"label":"刘德华",
"imageUrl":"https://liu-de-hua.png",
"linkUrl":"https://ai-ni-yi-wan-nian.wav",
"extra": {
"resType": "wav"
}
}]
})
自定义控件
# -*- coding: utf-8 -*-
import json
def handler(event, context):
input = json.loads(event)
return json.dumps({"duiWidget": "text", "text": "今天不用带伞", "extra": { "key1": "val1", "key2": "val2"}})