top-client
Version:
a client for taobao open platform.
116 lines (115 loc) • 5.03 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable indent */
/* eslint-disable camelcase */
const date_fns_1 = require("date-fns");
const axios_1 = require("axios");
const Stream = require("stream");
const FormData = require("form-data");
const JSONbig = require('json-bigint')({ storeAsString: true });
const utils_1 = require("./utils");
class TaobaoClient {
constructor(config) {
this.basicParam = {};
this.basicParam.v = '2.0';
this.basicParam.sign_method = 'md5';
this.basicParam.session = config.access_token;
this.basicParam.app_key = config.app_key;
this.basicParam.format = 'json';
this.basicParam.timestamp = '';
this.basicParam.method = '';
this.appsecret = config.app_secret;
this.apiUrl = 'https://eco.taobao.com/router/rest';
}
/**
* Invoke API
*
* @param {String} method API Name
* @param {Object} apiParam API Business parameters
* @return {Promise<AxiosResponse>} axios response
*/
invoke(method, apiParam) {
return __awaiter(this, void 0, void 0, function* () {
const url = this.apiUrl;
// top基础参数 + api 业务参数
const fullParams = {};
// top基础参数
const basic4query = {};
let isUpload = false;
let form = new FormData();
this.basicParam.method = method;
this.basicParam.timestamp = (0, date_fns_1.format)(new Date(), 'yyyy-MM-dd HH:mm:ss');
Object.assign(fullParams, this.basicParam);
Object.assign(basic4query, this.basicParam);
for (const param of Object.keys(apiParam)) {
if (Buffer.isBuffer(apiParam[param]) || apiParam[param] instanceof Stream) {
// 如果是需要上传文件的api
isUpload = true;
}
// 如果 api 业务参数是普通的 obj 的话,需要转成字符串
if (typeof apiParam[param] === 'object' &&
!Buffer.isBuffer(apiParam[param]) &&
!(apiParam[param] instanceof Stream)) {
apiParam[param] = JSON.stringify(apiParam[param]);
}
// 向 fullParams 加入 业务级参数
Object.defineProperty(fullParams, param, {
value: apiParam[param],
writable: true,
enumerable: true,
});
}
// 签名算法
basic4query.sign = (0, utils_1.sign)(fullParams, this.appsecret);
fullParams.sign = basic4query.sign;
if (isUpload) {
for (const param of Object.keys(apiParam)) {
form.append(param, apiParam[param]);
}
}
else {
form = null;
}
return isUpload
? axios_1.default.post(url, form, {
headers: form.getHeaders(),
params: basic4query,
timeout: 4e3,
transformResponse: [
(data) => {
data = JSONbig.parse(data);
if (data.error_response) {
return data.error_response;
}
// Do whatever you want to transform the data
return data[(0, utils_1.getApiResponseName)(method)];
},
],
})
: axios_1.default.post(url, {}, {
params: fullParams,
timeout: 4e3,
transformResponse: [
(data) => {
data = JSONbig.parse(data);
if (data.error_response) {
return data.error_response;
}
// Do whatever you want to transform the data
return data[(0, utils_1.getApiResponseName)(method)];
},
],
});
});
}
}
exports.default = TaobaoClient;