UNPKG

basic-ajax

Version:

A promisified ajax wrapper with json support, extensibility hooks and fixes to most common xhr issues built in.

139 lines (83 loc) 6.09 kB
# Basic-Ajax A promisified XMLHttpRequest wrapper with json support, extensibility hooks and fixes to most common xhr issues built in. This module's functions (GET, POST, PUT, PATCH and DELETE) returns a promise (https://promisesaplus.com/.) The module will return a JSON formatted response body as a property of the response object if the response Content-Type is "application/json". It provides JSON "happy" methods to make it easier to work with getting and sending JSON data. (See Usage below for more details.) It also provides a `postFormUrlEncoded()` method so you can pass the POST a vanilla JSON object and it will be serialised into a form url encoded body if you need to POST in this format. ## Installation npm install basic-ajax ## Usage Require the object: var ajax = require('basic-ajax'); ### GET's Just need to do a get? it's as simple as passing in the url: ajax.get('/users'); Just need to do a get and expect JSON back? Call getJson and it will set the "Accept" header correctly: ajax.getJson('/users'); Want to tell the server you accept xml or something else not JSON? Just set the "Accept" header manually: ajax.get('/users', {"Accept": "application/xml"}); You can of course set any headers you like: ajax.get('/users', {"Accept": "application/json", "Origin": "http://somedomain.com"}); Okay, so you are expecting JSON back? it's already parsed for you into a "json" property: ajax.getJson('/').then(function(response) { console.log("list of users:"); for(var index = 0; index < response.json.length; index++) { console.log(response.json[index].name); } }) ### POST's, PUT's and PATCH's Want to POST, PUT or PATCH some JSON? Just call the equivalent "JSON" method and pass in your object: We will set the content type header correctly for you and json stringify the object passed in. ajax.postJson('/users/add', {"name": "Nick", "age": 18}); ajax.putJson('/users/1', {"name": "Nick", "age": 18}); ajax.patchJson('/users/1', {"op": "replace", "path": "/age", "value": 21}); If you already have your JSON as a string, just pass in a string and we won't attempt to stringify it! ajax.postJson('/users/add', '{"name": "Nick", "age": 18}'); POSTing, PUTting or PATCHing something that isn't JSON? Want to set your own headers? Just use the base `post()`, `put()` or `patch()` methods and set the headers using a JSON object: ajax.post('/users/add', {"Content-Type": "application/xml"}, "<person><name>Nick</name><age>18</age></person>"); ### POSTing bodies in form-url-encoded format Just use the `postFormUrlEncoded()` method and pass in a JSON object: ajax.postFormUrlEncoded('/users/add', {"name": "Nick", "age": 12}); Note: This currently only works on a "shallow" object, ie. a JSON object that is just a set of name/ value pairs - no deep object graph or arrays. Pull requests accepted or let me know if you want this expanded on! ### DELETE's You can make a DELETE call by calling the `delete()` method: ajax.delete('/users/nick'); ### Response Headers: Do you wanna see wot response headers you got? Just check da .headers object! Say you get 2 response headers: "Content-Type" and "Location", just get them like this: ajax.get('/').then(function(response) { console.log(response.headers.Location); console.log(response.headers['Content-Type']); }); ### Request Headers: By default basic-ajax sets the `X-Requested-With` header to `XMLHttpRequest`. See the reasoning here: http://stackoverflow.com/a/22533680 but basically it allows for the server to prevent CSRF attacks. Basic-ajax does not allow you to override this setting as that is "A Bad Idea". ### Caching: By default basic-ajax stops all possible browser caching of ajax calls by setting the `Cache-Control` header to `no-cache`, the `Pragma` header to `no-cache` and the `If-Modified-Since` header to `1 Jan 2000`. This is to stop Internet Explorer's default behaviour to cache ajax calls. More info here: http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ If for some reason you want to turn this off you can just execute: `ajax.allowCaching = false` If for some reason you want to override any of these individual headers, just set them in the headers object you pass in and basic-ajax will use your values instead of it's own. ### Hooks: You can add pre and post hooks to basic-ajax. Pre hooks fire immediately prior to an `xhr.send()` and post hooks fire after a `load()`, `error()` or `abort()` event has been called. We provide the function: `ajax.setHooks([ordered, array, of, hooks])` in order to setup your hooks. A hooks provider should look like this: var hook = { pre: function (xhr, state) { console.log(xhr.method); }, post: function (ro, state) { console.log(ro.status); } }; * if a pre function returns an object with a `cancel=true` property on it then the `xhr.send()` will not fire and the promise will be immediately resolved returning an object with the `reason` string set to a `reason` string you return from the `pre()` function as well as the xhr object. * if a pre function cancels, no other hooks will get run. * you can setup either a pre or a post function or both in your hook * the state object is for passing state between the pre and post functions. * this state is private to each request and private to each hook that is run. * We don't currently allow for asynchronous hooks. * For more information look at the tests which should act as deeper documentation. We provide `ajax.addHooks()` to add hooks to the existing chain of hooks set up (whereas `ajax.setHooks` will replace the existing chain.) We also provide the function `ajax.removeHooks()` which will remove all hooks applied by the mechanisms above. ## Tests npm test