2
0
mirror of https://github.com/tenrok/axios.git synced 2026-05-15 11:59:42 +03:00
Files
axios/lib/axios.js
T
2014-08-27 02:08:39 -06:00

142 lines
3.6 KiB
JavaScript

var Promise = require('es6-promise').Promise;
var buildUrl = require('./buildUrl');
var defaults = require('./defaults');
var forEach = require('./forEach');
var merge = require('./merge');
var transformData = require('./transformData');
var axios = module.exports = function axios(options) {
options = merge({
method: 'get',
transformRequest: defaults.transformRequest,
transformResponse: defaults.transformResponse
}, options);
// Don't allow overriding defaults.withCredentials
options.withCredentials = options.withCredentials || defaults.withCredentials;
var promise = new Promise(function (resolve, reject) {
// Create the request
var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP');
var data = transformData(
options.data,
options.headers,
options.transformRequest
);
// Open the request
request.open(options.method, buildUrl(options.url, options.params), true);
// Listen for ready state
request.onreadystatechange = function () {
if (request && request.readyState === 4) {
// Prepare the response
var response = {
data: transformData(
request.responseText,
options.headers,
options.transformResponse
),
status: request.status,
headers: headers,
config: options
};
// Resolve or reject the Promise based on the status
if (request.status >= 200 && request.status < 300) {
resolve(response);
} else {
reject(response);
}
// Clean up request
request = null;
}
};
// Merge headers and add to request
var headers = merge(
defaults.headers.common,
defaults.headers[options.method] || {},
options.headers || {}
);
forEach(headers, function (val, key) {
// Remove Content-Type if data is undefined
if (typeof data === 'undefined' && key.toLowerCase() === 'content-type') {
delete headers[key];
}
// Otherwise add header to the request
else {
request.setRequestHeader(key, val);
}
});
// Add withCredentials to request if needed
if (options.withCredentials) {
request.withCredentials = true;
}
// Add responseType to request if needed
if (options.responseType) {
try {
request.responseType = options.responseType;
} catch (e) {
if (request.responseType !== 'json') {
throw e;
}
}
}
// Send the request
request.send(data);
});
// Provide alias for success
promise.success = function success(fn) {
promise.then(function(response) {
fn(response);
});
return promise;
};
// Provide alias for error
promise.error = function error(fn) {
promise.then(null, function(response) {
fn(response);
});
return promise;
};
return promise;
};
// Expose defaults
axios.defaults = defaults;
// Provide aliases for supported request methods
createShortMethods('delete', 'get', 'head');
createShortMethodsWithData('post', 'put', 'patch');
function createShortMethods() {
forEach(arguments, function (method) {
axios[method] = function (url, options) {
return axios(merge(options || {}, {
method: method,
url: url
}));
};
});
}
function createShortMethodsWithData() {
forEach(arguments, function (method) {
axios[method] = function (url, data, options) {
return axios(merge(options || {}, {
method: method,
url: url,
data: data
}));
};
});
}