// for CMD declare var require: any; declare var module: any; interface Config { url: string, params: any, $service: any }; import Ajax = require('./ajax'); var METHODS:Array = [ 'get', 'post', 'patch', 'delete', 'put' ]; function copy(raw: any) { var result: any; if (Array.isArray(raw)) { result = raw.map(function(item) { return copy(item); }); } else if (typeof raw === 'object' && raw !== null) { result = {}; for (var prop in raw) result[prop] = copy(raw[prop]); } else { result = raw; } return result; } class Http { headers: any; queryString: any; withCredentials: boolean; timeout: boolean; url: string; constructor(config: Config) { var self = this; METHODS.forEach(function(method: string) { self[method] = function(data: any) { data = copy(data); var xhr = new Ajax(config.$service); var url = config.url; for (var j in config.params) { if (data && data[j] != null) { url = url.replace(new RegExp(':' + j), data[j]); delete data[j]; } else { url = url.replace(new RegExp(':' + j + '\\/?'), ''); url = url.replace(/\/?$/, ''); } } if (method === 'get') { url = url.replace(/\/?$/, ''); url += '?'; for (var i in data) { url += (i + '=' + data[i] + '&'); } // 移除末尾的 ? or & url = url.slice(0, -1); } else if (self.queryString) { url = url.replace(/\/?$/, ''); url += '?'; for (var query in self.queryString) { url += query + '=' + self.queryString[query] + '&'; } url = url.slice(0, -1); } xhr.ajax.open(method.toUpperCase(), url); if (self.headers) { for (var header in self.headers) xhr.ajax.setRequestHeader(header, self.headers[header]); } // global config if (config.$service.headers) { for (var header in config.$service.headers) { if (!self.headers || !self.headers[header]) xhr.ajax.setRequestHeader(header, config.$service.headers[header]); } } xhr.ajax.withCredentials = config.$service.withCredentials; xhr.deferred = xhr.deferred.then(function(raw: any) { return config.$service.formatter ? config.$service.formatter(raw) : raw; }); xhr.ajax.send(JSON.stringify(data)); return xhr.deferred; }; }); } set(name: string, value: any) { switch(name.toLowerCase()) { case 'header': this.headers = this.headers || {}; for (var i in value) { this.headers[i] = value[i]; } break; case 'query': this.queryString = this.queryString || {}; for (var i in value) { this.queryString[i] = value[i]; } break; default: this[name] = value; } return this; } } module.exports = Http;