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"}})