mojito
Version:
Mojito provides an architecture, components and tools for developers to build complex web applications faster.
192 lines (168 loc) • 6.25 kB
JavaScript
/*
* Copyright (c) 2011-2013, Yahoo! Inc. All rights reserved.
* Copyrights licensed under the New BSD License.
* See the accompanying LICENSE file for terms.
*/
/*jslint anon:true, sloppy:true, nomen:true*/
/*global YUI*/
/**
* Common Library
* @module CommonLibs
*/
YUI.add('mojito-rest-lib', function(Y, NAME) {
Y.namespace('mojito.lib');
/**
* @private
*/
function ResponseObject(resp) {
this._resp = resp;
}
ResponseObject.prototype = {
getStatusCode: function() {
return this._resp.status;
},
getStatusMessage: function() {
return this._resp.statusText;
},
getHeader: function() {
return this._resp.getResponseHeader.apply(this._resp, arguments);
},
getHeaders: function() {
return this._resp.getAllResponseHeaders();
},
getBody: function() {
return this._resp.responseText;
}
};
/**
* The Rest module for Mojito provides an easy way to make RESTful calls to
* URLs without messing about with Y.io.
* @class REST
* @namespace Y.mojito.lib
*/
Y.namespace('mojito.lib').REST = {
/**
* Calls IO. Provides mockability
* @method _doRequest
* @param url
* @param config the IO configuration
* @param callback
* @private
*/
_doRequest: function (url, config) {
Y.io(url, config);
},
/**
* Creates the configuration to be passed to the IO request
* @method _makeRequest
* @param {String} method HTTP method
* @param {String} url HTTP location
* @param {Object} params Params that are passed in the request
* @param {Object} config Additional configuration
* @param {Object} config.headers Headers to be sent with the request
* @param {Number} config.timeout Timeout for the IO request
* @param {Function} callback The handler for the response
* @private
*/
_makeRequest: function(method, url, params, config, callback) {
// TODO: [Issue 72] Figure out why 'params' values are attaching
// themselves to headers!
var ioConfig = {
method: method,
on: {}
};
if (params) {
if (Y.Lang.isObject(params)) {
params = Y.QueryString.stringify(params);
}
if ('GET' === method) {
if (-1 === url.indexOf('?')) {
url += '?' + params;
} else {
url += '&' + params;
}
} else if ('POST' === method || 'PUT' === method) {
ioConfig.data = params;
}
}
if (config) {
ioConfig.headers = config.headers;
ioConfig.timeout = config.timeout;
}
if (callback) {
ioConfig.on.success = function(txid, resp) {
var responseObj = new ResponseObject(resp);
callback(null, responseObj);
};
ioConfig.on.failure = function(txid, resp) {
callback(resp);
};
}
this._doRequest(url, ioConfig);
},
/**
* Makes a RESTful GET request to specified URL
* @method GET
* @param {String} url RESTful URL to hit.
* @param {Object} params parameters to add to the request.
* @param {Object} config may contain 'headers' or 'timeout' values.
* @param {Function} callback called with response or error.
*/
GET: function() {
var args = ['GET'].concat(Array.prototype.slice.call(arguments));
this._makeRequest.apply(this, args);
},
/**
* Makes a RESTful POST request to specified URL
* @method POST
* @param {String} url RESTful URL to hit.
* @param {Object} params parameters to add to the request.
* @param {Object} config may contain 'headers' or 'timeout' values.
* @param {Function} callback called with response or error.
*/
POST: function() {
var args = ['POST'].concat(Array.prototype.slice.call(arguments));
this._makeRequest.apply(this, args);
},
/**
* Makes a RESTful PUT request to specified URL
* @method PUT
* @param {String} url RESTful URL to hit.
* @param {Object} params parameters to add to the request.
* @param {Object} config may contain 'headers' or 'timeout' values.
* @param {Function} callback called with response or error.
*/
PUT: function() {
var args = ['PUT'].concat(Array.prototype.slice.call(arguments));
this._makeRequest.apply(this, args);
},
/**
* Makes a RESTful DELETE request to specified URL
* @method DELETE
* @param {String} url RESTful URL to hit.
* @param {Object} params parameters to add to the request.
* @param {Object} config may contain 'headers' or 'timeout' values.
* @param {Function} callback called with response or error.
*/
DELETE: function() {
var args = ['DELETE'].concat(Array.prototype.slice.call(arguments));
this._makeRequest.apply(this, args);
},
/**
* Makes a RESTful HEAD request to specified URL
* @method HEAD
* @param {String} url RESTful URL to hit.
* @param {Object} params parameters to add to the request.
* @param {Object} config may contain 'headers' or 'timeout' values.
* @param {Function} callback called with response or error.
*/
HEAD: function() {
var args = ['HEAD'].concat(Array.prototype.slice.call(arguments));
this._makeRequest.apply(this, args);
}
};
}, '0.1.0', {requires: [
'io-base',
'querystring-stringify-simple',
'mojito'
]});