前言
该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
};