...
|
...
|
@@ -7,12 +7,16 @@ |
|
|
'use strict';
|
|
|
|
|
|
const rp = require('request-promise');
|
|
|
const qs = require('querystring');
|
|
|
const md5 = require('md5');
|
|
|
const _ = require('lodash');
|
|
|
const log = require('./logger');
|
|
|
const api = require('../config/common').domains.api;
|
|
|
const serviceApi = require('../config/common').domains.service;
|
|
|
const searchApi = require('../config/common').domains.search;
|
|
|
const cache = require('./cache');
|
|
|
const Timer = require('./timer');
|
|
|
const config = require('../config/common');
|
|
|
const api = config.domains.api;
|
|
|
const serviceApi = config.domains.service;
|
|
|
const searchApi = config.domains.search;
|
|
|
|
|
|
|
|
|
let ApiUrl;
|
...
|
...
|
@@ -24,54 +28,107 @@ class API { |
|
|
}
|
|
|
|
|
|
/**
|
|
|
* get
|
|
|
* @param url String
|
|
|
* @param data Obejct
|
|
|
* 获取请求 ID
|
|
|
*/
|
|
|
get(url, data) {
|
|
|
|
|
|
let options = {
|
|
|
url: `${ApiUrl}${url}`,
|
|
|
qs: data
|
|
|
};
|
|
|
_getReqId(options) {
|
|
|
return md5(`${options.url}?${qs.stringify(options.qs || options.form)}`);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 调用接口
|
|
|
*/
|
|
|
_requestFromAPI(options, cacheOption, reqId) {
|
|
|
let timer = new Timer();
|
|
|
|
|
|
timer.put('getApi');// 统计时间开始
|
|
|
|
|
|
let ret = rp(options);
|
|
|
|
|
|
ret.then((body)=>{
|
|
|
let duration = timer.put('getApi');// 接口返回
|
|
|
|
|
|
log.info('API GET: %s, parms: %j , durationMs: %d ms , body: %s', options.url, options.qs, duration, body);
|
|
|
log.info(`get api: ${options.url}?${qs.stringify(options.qs)}`);
|
|
|
return rp(options).then((result) => {
|
|
|
let duration = timer.put('getApi');// 统计时间结束
|
|
|
|
|
|
log.info(`get api success: use: ${duration}ms`);
|
|
|
if (config.useCache && cacheOption) {
|
|
|
reqId = reqId || this._getReqId(options);
|
|
|
|
|
|
// 数据校验无误,写缓存, 否则返回 Slave 缓存服务器的数据
|
|
|
if (result && result.code) {
|
|
|
let cacheTime = _.isNumber(cacheOption) ? cacheOption : 60;
|
|
|
|
|
|
cache.set(`apiCache:${reqId}`, result, cacheTime);
|
|
|
cache.setSlave(`apiCache:${reqId}`, result, cacheTime);
|
|
|
} else {
|
|
|
return this._requestFromCache(options, true);
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}).catch((error)=>{
|
|
|
let duration = timer.put('getApi');// 接口返回
|
|
|
let duration = timer.put('getApi');// 统计时间结束
|
|
|
|
|
|
log.error('API GET: %s, parms: %j , durationMs: %d ms error: %s , statusCode: %d',
|
|
|
options.url, options.qs, duration, error.message, error.statusCode);
|
|
|
});
|
|
|
log.error(`get api fail: use: ${duration}ms, statusCode: ${error.statusCode}, error: ${error.message}`);
|
|
|
|
|
|
return ret;
|
|
|
// 使用缓存的时候,读取二级缓存
|
|
|
if (config.useCache) {
|
|
|
return this._requestFromCache(options, true);
|
|
|
}
|
|
|
return Promise.reject({
|
|
|
error: '接口调用失败'
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* multi get
|
|
|
* @params: urls => Array[Object[url[string], data[object]]]
|
|
|
* 读取缓存
|
|
|
* @param {[object]} options
|
|
|
* @param {[boolean]} slave true: 读取二级缓存
|
|
|
* @return {[type]}
|
|
|
*/
|
|
|
multiGet(urls) {
|
|
|
var rps = [];
|
|
|
|
|
|
_.forEach(urls, function(el) {
|
|
|
rps.push(rp({
|
|
|
url: `${ApiUrl}${el.url}`,
|
|
|
qs: el.data
|
|
|
}));
|
|
|
_requestFromCache(options, slave) {
|
|
|
let reqId = this._getReqId(options);
|
|
|
let getCache = slave ? cache.getFromSlave : cache.get;
|
|
|
|
|
|
log.info(`get cache: ${reqId}, url: ${options.url}?${qs.stringify(options.qs)}`);
|
|
|
return getCache(`apiCache:${reqId}`).then((result) => {
|
|
|
if (!_.isNil(result)) {
|
|
|
try {
|
|
|
result = JSON.parse(result);
|
|
|
} finally {
|
|
|
log.info(slave ? 'get slave cache success' : 'get master cache success');
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!slave) {
|
|
|
return this._requestFromAPI(options, true, reqId);
|
|
|
}
|
|
|
}).catch(() => {
|
|
|
log.error(slave ? 'get slave cache fail' : 'get master cache fail');
|
|
|
if (!slave) {
|
|
|
return this._requestFromAPI(options, true, reqId);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return Promise.all(rps).then((d) => {
|
|
|
return d;
|
|
|
});
|
|
|
/**
|
|
|
* 使用 get 请求获取接口
|
|
|
* @param {[string]} url
|
|
|
* @param {[object]} data
|
|
|
* @param {[bool or number]} cacheOption 使用数字时,数字表示缓存时间
|
|
|
* @return {[type]}
|
|
|
*/
|
|
|
get(url, data, cacheOption) {
|
|
|
let options = {
|
|
|
url: `${ApiUrl}${url}`,
|
|
|
qs: data,
|
|
|
json: true,
|
|
|
timeout: 3000
|
|
|
};
|
|
|
|
|
|
// 从缓存获取数据
|
|
|
if (config.useCache && cacheOption) {
|
|
|
return this._requestFromCache(options);
|
|
|
}
|
|
|
|
|
|
return this._requestFromAPI(options, cacheOption);
|
|
|
}
|
|
|
|
|
|
/**
|
...
|
...
|
@@ -80,11 +137,22 @@ class API { |
|
|
* @param data Obejct
|
|
|
*/
|
|
|
post(url, data) {
|
|
|
return rp({
|
|
|
let options = {
|
|
|
url: `${ApiUrl}${url}`,
|
|
|
form: data,
|
|
|
method: 'post',
|
|
|
form: data
|
|
|
});
|
|
|
json: true,
|
|
|
timeout: 3000
|
|
|
};
|
|
|
|
|
|
return this._requestFromAPI(options);
|
|
|
}
|
|
|
|
|
|
all(list) {
|
|
|
if (_.isArray(list)) {
|
|
|
return Promise.all(list);
|
|
|
}
|
|
|
throw Error('the parameters of api all method should be Array!');
|
|
|
}
|
|
|
}
|
|
|
|
...
|
...
|
|