A tiny wrapper around XMLHttpRequest.
It is tested in the following browsers:
- Chrome v. 23
- Firefox v. 17
- Opera v. 12.11
- Safari v. 6
- IE v. 9
- IE v. 8
It requires an ES6 compatible Promise
implementation. You can shim this with
either es6-shim
or es6-promise
. The Promise
constructor should be available
in global scope.
Note for IE8 and below: You need to supply a shim for Function.prototype.bind.
It does not work in IE7 or below out of the box when receiving application/json
,
because JSON.parse
is not supported. If this is a requirement, then use
something like json2 from
Douglas Crockford. Everything else seems to work.
Using this could not be more simple:
var fajax = require('fajax')
fajax.defaults({
baseUrl: 'http://my-server.com',
accept: 'application/json'
})
fajax.get('/some-resource').then(function(xhr) {
// if the server returns Content-Type: application/json,
// this is already parsed for us
var jsonBody = xhr.body
})
// Sometime later
fajax.post('/some-action', { json: jsonBody })
.then(function(xhr) {
// Report success
},
// The promise is rejected if the status code is 400 or higher
function(xhr) {
// Handle validation error or the like
})
Include this by calling var fajax = require('fajax')
. This require that you
use a build-tool that is compatible with CommonJS, such as browserify or webpack.
The returned function have two static methods:
-
fajax.qs(queryStringCreator)
: Assigns a specific query-string creator function. This is used whenform
is specified in the options.For example, it is simple to use the excellent qs library:
// fajax and qs loaded via ender: $.ajax.qs($.stringify)
-
fajax.defaults(newDefaults)
: Updates the defaults. Notice that this adds to the defaults, sofajax.defaults({ method: 'post' }); fajax.defaults({ accept: 'application/json' })
is the same as
fajax.defaults( { method: 'post' , accept: 'application/json' })
An interesting parameter in the defaults is baseUrl
. This is resolved on the
url passed in when initiating a request, so this is an easy way to normalize
urls based on either a folder or a server.
Example:
fajax.defaults({ baseUrl: 'http://example.com' })
fajax.get('/test') // -> GET to http://example.com/test
fajax.defaults({ baseUrl: '/foo' })
fajax.get('bar') // -> GET to <currentDomain>/foo/bar
fajax.get('/absolute') // -> GET to <currentDomain>/absolute
The function itself can take 3 arguments:
- An options dictionary (more on this below).
- A
string
of the url for the request. This can also be given asurl
in the options dictionary. - An optional
function
that will be called when the request is complete. This can also be given asonload
in the options dictionary.
The options dictionary supports the following keys:
-
headers
: A key-value based list of request headers to set. -
accept
: The accept header. This defaults to the browsers normal value. Ifaccept
is set here, it will override the value in the headers-list. -
method
: The http-method to use. It defaults toGET
. -
body
: Sends some text to the server. It defaults theContent-Type
header totext/plain
, but won't override a specifically set header. -
json
: Sends the given object as JSON. This requires JSON.stringify to be available in global scope.It will override
Content-Type
withapplication/json
. -
form
: Sends the given string or object as form-parameters. The basic implementation will only send a flat object, discarding any values that are notString
,Boolean
orNumber
.For a more extensive implementation, you can provide any function via the
fajax.qs(func)
function.It will override
Content-Type
withapplication/x-www-form-urlencoded
.
It is also possible to initiate a request with fajax.request()
.
It takes the method as the first parameter, but otherwise acts exactly like
fajax()
.
For convenience, there are shorthands for the basic HTTP methods:
fajax.get()
fajax.head()
fajax.post()
fajax.put()
fajax.delete()
orfajax.del()
fajax.patch()
fajax.options()
They all act as the primary function (fajax()
), except they also enforce the
method
option.