aliyun-sdk
Version:
Aliyun SDK for JavaScript
129 lines (115 loc) • 4.17 kB
JavaScript
var ALY = require('../core');
var inherit = ALY.util.inherit;
// 目前 query 是针对 top 调用的
ALY.ServiceInterface.Query = {
buildRequest: function buildRequest(req) {
var operation = req.service.api.operations[req.operation];
var httpRequest = req.httpRequest;
httpRequest.method = 'GET';
httpRequest.headers['Content-Type'] =
'application/x-www-form-urlencoded; charset=utf-8';
httpRequest.params = {
Action: operation.name,
Version: req.service.api.apiVersion,
Timestamp: ALY.util.date.iso8601(ALY.util.date.getDate()),
Format: 'json',
AccessKeyId: req.service.config.accessKeyId,
SignatureVersion: '1.0',
SignatureMethod: 'HMAC-SHA1',
SignatureNonce: ALY.util.uuid()
};
// convert the request parameters into a list of query params,
// e.g. Deeply.NestedParam.0.Name=value
var rules = operation.input;
if (rules) rules = rules.members;
var builder = new ALY.QueryParamSerializer(rules, req.service.api);
builder.serialize(req.params, function(name, value) {
httpRequest.params[name] = value;
});
httpRequest.path = '/?' + ALY.util.queryParamsToString(httpRequest.params);
},
extractError: function extractError(resp) {
var data = JSON.parse(resp.httpResponse.body.toString());
if (data.Code) {
resp.error = ALY.util.error(new Error(), {
code: data.Code,
message: data.Message,
RequestId: data.RequestId
});
} else {
resp.error = ALY.util.error(new Error(), {
code: resp.httpResponse.statusCode,
message: null,
RequestId: data.RequestId
});
}
},
extractData: function extractData(resp) {
resp.data = resp.httpResponse.body.toString();
}
};
/**
* @api private
*/
ALY.QueryParamSerializer = inherit({
constructor: function QueryParamSerializer(rules, options) {
this.rules = rules;
this.timestampFormat = options ? options.timestampFormat : 'iso8601';
},
serialize: function serialize(params, fn) {
this.serializeStructure('', params, this.rules, fn);
},
serializeStructure: function serializeStructure(prefix, struct, rules, fn) {
var that = this;
ALY.util.each(struct, function (name, member) {
var n = rules[name].name || name;
var memberName = prefix ? prefix + '.' + n : n;
that.serializeMember(memberName, member, rules[name], fn);
});
},
serializeMap: function serialzeMap(name, map, rules, fn) {
var i = 1;
var that = this;
ALY.util.each(map, function (key, value) {
var prefix = rules.flattened ? '.' : '.entry.';
var position = prefix + (i++) + '.';
var keyName = position + (rules.keys.name || 'key');
var valueName = position + (rules.members.name || 'value');
that.serializeMember(name + keyName, key, rules.keys, fn);
that.serializeMember(name + valueName, value, rules.members, fn);
});
},
serializeList: function serializeList(name, list, rules, fn) {
var that = this;
var memberRules = rules.members || {};
ALY.util.arrayEach(list, function (v, n) {
var suffix = '.' + (n + 1);
if (rules.flattened) {
if (memberRules.name) {
var parts = name.split('.');
parts.pop();
parts.push(memberRules.name);
name = parts.join('.');
}
} else {
suffix = '.member' + suffix;
}
that.serializeMember(name + suffix, v, memberRules, fn);
});
},
serializeMember: function serializeMember(name, value, rules, fn) {
if (value === null || value === undefined) return;
if (rules.type === 'structure') {
this.serializeStructure(name, value, rules.members, fn);
} else if (rules.type === 'list') {
this.serializeList(name, value, rules, fn);
} else if (rules.type === 'map') {
this.serializeMap(name, value, rules, fn);
} else if (rules.type === 'timestamp') {
var timestampFormat = rules.format || this.timestampFormat;
fn.call(this, name, ALY.util.date.format(value, timestampFormat));
} else {
fn.call(this, name, String(value));
}
}
});