api.js 2.19 KB
/**
 * 接口公共方法
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2016/4/25
 */

'use strict';

const rp = require('request-promise');
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 Timer = require('./timer');


let ApiUrl;

class API {

    constructor() {
        ApiUrl = api;
    }

    /**
     * get
     * @param url String
     * @param data Obejct
     */
    get(url, data) {

        let options = {
            url: `${ApiUrl}${url}`,
            qs: data
        };

        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);
        }).catch((error)=>{
            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);
        });

        return ret;
    }

    /**
     * multi get
     * @params: urls => Array[Object[url[string], data[object]]]
     */
    multiGet(urls) {
        var rps = [];

        _.forEach(urls, function(el) {
            rps.push(rp({
                url: `${ApiUrl}${el.url}`,
                qs: el.data
            }));
        });

        return Promise.all(rps).then((d) => {
            return d;
        });
    }

    /**
     * post
     * @param url String
     * @param data Obejct
     */
    post(url, data) {
        return rp({
            url: `${ApiUrl}${url}`,
            method: 'post',
            form: data
        });
    }
}

class ServiceAPI extends API {
    constructor() {
        super();
        ApiUrl = serviceApi;
    }
}

class SearchAPI extends API {
    constructor() {
        super();
        ApiUrl = searchApi;
    }
}

exports.API = API;
exports.ServiceAPI = ServiceAPI;
exports.SearchAPI = SearchAPI;