Nodejs同步访问RestAPI的Utils封装

前言


该Utils实现了以下封装

  • 根据API式样对request数据按进行封装
  • 根据API式样对response数据进行解析
  • 使用co风格同步发送API请求

导入第三方Package


var request = require('request');

关于request,参考其github

Request封装处理和Response解析处理


  • 封装处理用于对请求data添加共通部分(commonRequest)
  • 解析处理用于从响应信息中获取data

假设API式样的共通部分如下
Request示例

{
  commonRequest: {
  },
  data: …
}

Response示例

{
  commonResponse: {
    code: I01001,
    message: success
  },
  data: …
}

** 处理用代码如下 **

var setReqData = function(json) {
  var reqData = {
    commonRequest: {},
    data: json
  };
  return reqData;
};

var getResData = function(json) {
  var code = json.commonResponse.code;
  if (code !== 'I00001') {
    throw new Error(json.commonResponse.message);
  }
  return json.data;
};

使用co风格同步发送API请求


由于request本身不提供co风格的调用接口。
而且如果使用co-request,需要使用node --harmony simple.js的方法启动nodejs,
为了避免不必要的麻烦,自己对request进行简单封装

var send = function*(api, data) {
  var options = {
    headers: {
      charset: 'UTF-8'
    },
    url: 'https://127.0.0.1:8080/' + api,
    method: 'POST',
    body: setReqData(data),
    json: true
  };
  var rep = yield new Promise(function(resolve, reject) {
    return request(options, function(err, response, body) {
      if (err) {
        reject(err);
      } else {
        resolve(response);
      }
    });
  });
  return getResData(rep);
};

调用示例


var restUtils = require('./rest_utils');
var co = require('co');

co(function*() {
  var retvalue = yield restUtils.send('test/list', {id:1000});
  console.log(retvalue);
});

完整代码


'use strict';

var request = require('request');
var config = require('../config');

var setReqData = function(json) {
  var reqData = {
    commonRequest: {},
    data: json
  };

  return reqData;
};

var getResData = function(json) {
  var code = json.commonResponse.code;
  if (code !== 'I00001') {
    throw new Error(json.commonResponse.message);
  }
  return json.data;
};

var send = function*(api, data) {
  var options = {
    headers: {
      charset: 'UTF-8'
    },
    url: config.rest.PROTOCOL + '://' + config.rest.HOST + ':' +
      config.rest.PORT + '/' + api,
    method: 'POST',
    body: setReqData(data),
    json: true
  };

  var rep = yield new Promise(function(resolve, reject) {
    return request(options, function(err, response, body) {
      if (err) {
        reject(err);
      } else {
        resolve(response);
      }
    });
  });

  return getResData(rep);
};

module.exports = {
  send: send
};

你可能感兴趣的:(Nodejs同步访问RestAPI的Utils封装)