slim-ajax v2.0.0

An Advanced light-weight AJAX API for node and all modern browsers (download).
Philosophy
Although jQuery AJAX is one the most complete AJAX APIs fow Web development, it is not independent from the rest of the jQuery library. Moreover, by the introduction of advanced Web development frameworks like React, Angular, and Vue, the existence of an independent advanced light-weight AJAX API is necessary more than ever. Slim-AJAX is meant to fulfill this requirement for developers who think beyond the Internet Explorer and old browsers era.
Slim-AJAX incorporates some well-known and frequently used design patterns including singletone, chaining, lazy-instantiation, and factory pattern to provide advanced, user-friendly, and professional API.
Installation
This is a Node.js module available through the npm registry.
Before installing, download and install Node.js. Node.js 0.10 or higher is required.
Installation is done using the
npm install command:
$ npm install slim-ajaxSlim-AJAX API
const slimAjax = require('slim-ajax');
slimAjax.request("GET", "/", true, [username, password]).send(data);
slimAjax.request("POST", "/", true, [username, password]).send(data);
slimAjax.get("/", true, [username, password]).send(data);
slimAjax.post("/", true, [username, password]).send(data);Each of the request, get, and post methods as the top-level methods of Slim-AJAX API supports chaining true the following methods:
- setHeaders({headerName: value})
This method gets an object containing the http headers and their corresponding values as a set of key-value pairs. It clearly sets those headers in the AJAX request to their corresponding values.
Example:
slimAjax.post(...).setHeaders({'Content-Type', 'text/html'});- setPropsHandlers({property/event: value})
This method gets an object containing any of the properties and handlers supported by Slim-Ajax API as a set of key-value pairs. Similar to the previous method, it sets those properties and handlers to their corresponding values.
Slim_Ajax supports the following properties and handlers:
|property | Description |
|:--------------------|:-------------------------------------------------------------------------------|
|contentType | sets the value of 'Content-Type' http header |
|responseType | sets the value of the 'responseType' property of the XMLHttprequest object |
|overrideMimeTypeWith | its value will be used to override the MimeType of the response |
|timeout | sets the value of the 'timeout' property of the XMLHttprequest object |
|noCache | noCache: true prevents browsers from caching the response |
|cors | cors: true makes the Cross-Origin Resource Sharing possible |
| Handler | Description |
|---|---|
| onSuccess | equivalent to (readyState === 4 && status === 200) |
| onFailure | complement of "onSuccess" |
| onLoadStart | "onloadstart" event handler of the XMLHttprequest object |
| onProgress | "onprogress" event handler of the XMLHttprequest object |
| onAbort | "onabort" event handler of the XMLHttprequest object |
| onError | "onerror" event handler of the XMLHttprequest object |
| onLoad | "onload" event handler of the XMLHttprequest object |
| onTimeout | "ontimeout" event handler of the XMLHttprequest object |
| onLoadEnd | "onloadend" event handler of the XMLHttprequest object |
Note: The http Content-Type header can be also set via setHeaders('Content-Type', ...). However, the "contentType" property is just a convenience since this http header is commonly used in almost all AJAX requests.
Example:
slimAjax.post(...).setPropsHandlers({
contentType: 'text/html',
timeout: 100,
onSuccess: (resObject, globals) => {
// ...
},
onFailure: (resObject) => {
// ...
},
onLoad: (event, resObject, globals) => {
// ...
}
});Note: Read more about arguments passed to onSuccess, onFailure, and onLoad handlers on globals and on resObject in this documentation.
- setUploadHandlers({event: handler})
This method sets the event handler on the XMLHttprequest.upload object. The handlers are the same as those in the previous method EXCEPTonSuccess and onFailure which are only available for XMLHttprequest object.
Example:
slimAjax.post(...).setUploadHandlers({
onAbort: (event) => {
// ...
},
onLoad: (event, resObject, globals) => {
// ...
}
});- send(data)
This method is equivalent to send() method on XMLHttprequest. However, it has some improved functionality depending on the http method in the request. For GET method, it essentially sends the encoded url regardless of the data passed to it while, for the POST method, it actually sends the passed data through the request. This method returns the XMLHttprequest object created under the hood.
Note: All of the above methods except the send() method support chaining. So, after calling send() chaining other methods is not possible. This implies that send() should be always used as the last method in the chain.
Global and static properties of the Slim_AJAX API
slimAjax.globals
Slim_AJAX API provides developers with a global object which will be always passed to onSuccess, and onLoad event handlers regardless of the top-level method i.e. request, get, and post. This global value will be passed to onSuccess, and onLoad event handlers as the last argument which we call it globals in examples for the sake of clarity.
Examples
1.
```javascript
slimAjax.globals = {
mytext: 'Slim_AJAX API',
myFunc: function(){
//...
};
slimAjax.request(...).send();
slimAjax.get(...).send();
slimAjax.post(...).send();
``` 2.
```javascript
slimAjax.globals = "This text will be automatically passed to the main methods discussed above";
slimAjax.request(...).send();
slimAjax.get(...).send();
slimAjax.post(...).send();
```Static properties
Every top-level method of Slim_AJAX API (i.e. request(), get(), and post()) supports a static property called defaults. This is a JavaScript object containing key-value pairs of "properties and handlers". The main point of such a static value is to share the most general settings on that particular top-level method for further use. So, after slimAjax.post.defaults = ... is done, any further use of post() top-level method will automatically set all the corresponding properties and/or handlers in the default object for that post() request.
Notes:
1. Although slimAjax.post.defaults = ... will set the default properties and handlers for any future post() call, any of those already set properties and handlers can be overwritten by using the API methods explained before.
- The
defaultsobject is only meant for setting properties and handlers for theXMLHttprequestobject. Event handlers forXMLHttprequest.uploadhas to be always set separately viasetUploadHandlers()method.
Examples
1.
```javascript
slimAjax.get.defaults = {
contentType: 'text/html',
onSuccess: function(resObject, globals){
//...
}
slimAjax.get(...).send();
``` 2.
```javascript
slimAjax.post.defaults = {
contentType: 'text/html',
onSuccess: function(resObject, globals){
//...
}
slimAjax.post(...).setPropsHandlers({ // overwriting the "contentType" which was set by defaults
contentType: 'application/json'
}.send(data);
```resObject argument passed to the main handlers
Another object that is passed to onSuccess, onFailure, and onLoad handlers is the resObject. This is the object that contains main data of the response as well as two important methods of XMLHttprequest object which are mainly used after the response is ready. However, the resObject contains different data regarding the the handler to which it is passed as well as the value of the responseType property of the request.
resObject passed to onSuccess and onLoad handlers
Depending on the type of the responseType set for the AJAX request, the resObject contains different members:
| responseType | members of resObject |
|---|---|
| "" or "text" | response, responseText, getResponseHeader, getAllResponseHeaders |
| "document" | response, responseXML, getResponseHeader, getAllResponseHeaders |
resObject passed to onFailure handler
The members of passed to this event handler are:
members of resObject | Circumstance |
|---|---|
| status, getResponseHeader, getAllResponseHeaders | if failure caused by the status other than 200 |
| readyState, getResponseHeader, getAllResponseHeaders | if failure caused by the readyState other than |
Note: Neither globals nor resObject will be passed to other event handlers.
Defining event handlers
Examples
slimAjax.get.defaults = { // Note the differences between these handlers in terms of arguments contentType: 'text/html', onSuccess: function(resObject, globals){ //... } onFailure: function(resObject){ //... } onLoad: function(event, resObject, globals){ //... } } slimAjax.get(...).send();slimAjax.post(...).setPropsHnadlers({ contentType: 'json', onSuccess: function(resObject, globals){ //... } onFailure: function(resObject){ //... } onLoad: function(event, resObject, globals){ //... } }).send(data);slimAjax.request(...).setPropsHnadlers({ contentType: 'form', onAbort: function(event){ //... } onError: function(event){ //... } }).send();
PROTIP: Among all events provided by Slim-AJAX API, only the onSuccess event can accept an array of functions. In that case, all those functions will be called in the order. Note that every function receives reObject and globals as if that function was the only assigned handler.
Example
slimAjax.request(...).setPropsHnadlers({
contentType: 'form',
onSuccess: [
function(resObject, globals){
//...
},
function(resObject, globals){
//...
},
function(resObject, globals){
//...
}
]
}).send(); Differences between top-level methods
slimAjax.request():
The general AJAX method which requires an http method as well as a url. The defaults object of this method is set to:
{
contentType: "",
responseType: "",
overrideMimeTypeWith: null,
timeout: 0,
noCache: true,
cors: false
}slimAjax.get():
The convenience method fo http GET requests that require a url. The defaults object of this method is set to:
{
contentType: "text/html",
responseType: "text",
timeout: 0,
noCache: true,
cors: true
}slimAjax.post():
The convenience method fo http POST requests that require a url. The defaults object of this method is set to:
{
contentType: "application/json",
responseType: "json",
timeout: 0,
noCache: true,
cors: true
}Username & password in top-level methods
If for the AJAX request a basic authentication is required, slim_AJAX API will handle that automatically. For having that done, it is only necessary that NEITHER username NOR password be empty strings. Under this condition, Slim_AJAX API will automatically set the Authorization http header to the required value made out of the username and password.
Convenience shorthand strings for the content-types
Since setting Content-Type http header is such a common task in almost every AJAX request, there are a list of shorthand strings for the most frequently used http content types. However, these shorthand strings can only be used for setting contentType property via setPropsHandlers() method or inside the defaults object. The following table lists the available shorthand strings.
| Shorthand | Corresponding formal http MimeType |
|---|---|
| text | text/plain |
| html | text/html |
| css | text/css |
| js | application/javascript |
| json | application/json |
| form | application/x-www-form-urlencoded |
| xml | text/xml |
| application/pdf | |
| jpeg | image/jpeg |
| png | image/png |
| gif | image/gif |
| svg | image/svg+xml |
| wma | audio/x-ms-wma |
| mp4 | video/mp4 |
| ai | application/postscript |
| zip | application/zip |
Examples
slimAjax.get.defaults = { contentType: "json", // ... } slimAjax.get(...).send();```javascript slimAjax.post(...).setPropsHandlers({ contentType: "form", // ... } ```Note: For setting http content-type to MimeType other than those in the above table, either the value of
contentTypeproperty orContent-Typeheader must be explicitly set to that MimeType.
People
The author of Slim-AJAX is Pedram Emami.