UNPKG

sync-alisdk

Version:

Taobao Open API & Message Client.

148 lines (134 loc) 4.22 kB
var util = require('../../../../Desktop/sdk-nodejs-24570894/lib/topUtil.js'); var RestClient = require('./../../../../Desktop/sdk-nodejs-24570894/lib/api/network.js') var Stream = require('stream') /** * Dingtalk API Client. * * @param {Object} options. * @constructor */ function DingtalkClient(options) { if (!(this instanceof DingtalkClient)) { return new DingtalkClient(options); } options = options || {}; this.url = options.url || 'https://eco.taobao.com/router/rest'; } /** * Invoke an api by method name. * * @param {String} method, method name * @param {Object} params * @param {Array} reponseNames, e.g. ['tmall_selected_items_search_response', 'tem_list', 'selected_item'] * @param {Object} defaultResponse * @param {Function(err, response)} callback */ DingtalkClient.prototype.invoke = function (type,method, params,reponseNames, callback) { params.method = method; this.request(type,params,function (err, result) { if (err) { return callback(err); } var response = result; if (reponseNames && reponseNames.length > 0) { for (var i = 0; i < reponseNames.length; i++) { var name = reponseNames[i]; response = response[name]; if (response === undefined) { break; } } } callback(null, response); }); }; /** * Request API. * * @param {Object} params * @param {String} [type='GET'] * @param {Function(err, result)} callback * @public */ DingtalkClient.prototype.request = function (type,params,callback) { var err = util.checkRequired(params, 'method'); if (err) { return callback(err); } var args = { timestamp: this.timestamp(), format: 'json', v: '2.0', sign_method: 'md5' }; var request = null; if(type == 'get'){ request = RestClient.get(this.url); }else{ request = RestClient.post(this.url); } for (var key in params) { if(typeof params[key] === 'object' && Buffer.isBuffer(params[key])){ request.attach(key,params[key],{knownLength:params[key].length,filename:key}) } else if(typeof params[key] === 'object'){ args[key] = JSON.stringify(params[key]); } else{ args[key] = params[key]; } } args.sign = this.sign(args); for(var key in args){ request.field(key, args[key]); } request.end(function(response){ if(response.statusCode == 200){ var data = response.body; var errRes = data && data.error_response; if (errRes) { callback(errRes, data); }else{ callback(err, data); } }else{ err = new Error('NetWork-Error'); err.name = 'NetWork-Error'; err.code = 15; err.sub_code = response.statusCode; callback(err, null); } }) }; /** * Get now timestamp with 'yyyy-MM-dd HH:mm:ss' format. * @return {String} */ DingtalkClient.prototype.timestamp = function () { return util.YYYYMMDDHHmmss(); }; /** * Sign API request. * see http://open.taobao.com/doc/detail.htm?id=111#s6 * * @param {Object} params * @return {String} sign string */ DingtalkClient.prototype.sign = function (params) { var sorted = Object.keys(params).sort(); var basestring = this.appsecret; for (var i = 0, l = sorted.length; i < l; i++) { var k = sorted[i]; basestring += k + params[k]; } basestring += this.appsecret; return util.md5(basestring).toUpperCase(); }; /** * execute top api */ DingtalkClient.prototype.execute = function (apiname,params,callback) { this.invoke(apiname, params, [util.getApiResponseName(apiname)], callback); }; DingtalkClient.prototype.get = function (apiname,params,callback) { this.invoke(apiname, params, [util.getApiResponseName(apiname)], callback); }; exports.DingtalkClient = DingtalkClient;