# qwest
**Repository Path**: mirrors_fis-components/qwest
## Basic Information
- **Project Name**: qwest
- **Description**: Fork from https://github.com/pyrsmk/qwest.git
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-08-08
- **Last Updated**: 2025-12-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
qwest 4.1.1
============
Qwest is a simple ajax library based on `promises` and that supports `XmlHttpRequest2` special data like `ArrayBuffer`, `Blob` and `FormData`.
Install
-------
```
npm install qwest
bower install qwest
jam install qwest
```
What's new in 4.0?
------------------
- call `abort()` to abort an async request
- group requests
- `complete()` has been removed
Quick examples
--------------
```js
qwest.get('example.com')
.then(function(xhr, response) {
alert(response);
});
```
```js
qwest.post('example.com', {
firstname: 'Pedro',
lastname: 'Sanchez',
age: 30
})
.then(function(xhr, response) {
// Make some useful actions
})
.catch(function(e, xhr, response) {
// Process the error
});
```
Basics
------
```js
qwest.`method`(`url`, `data`, `options`, `before`)
.then(function(xhr, response) {
// Run when the request is successful
})
.catch(function(e, xhr, response) {
// Process the error
});
```
The method is either `get`, `post`, `put` or `delete`. The `data` parameter can be a multi-dimensional array or object, a string, an ArrayBuffer, a Blob, etc... If you don't want to pass any data but specify some options, set data to `null`.
The available `options` are :
- dataType : `post` (by default), `json`, `text`, `arraybuffer`, `blob`, `document` or `formdata` (you don't need to specify XHR2 types since they're automatically detected)
- responseType : the response type; either `auto` (default), `json`, `xml`, `text`, `arraybuffer`, `blob` or `document`
- cache : browser caching; default is `false`
- async : `true` (default) or `false`; used to make asynchronous or synchronous requests
- user : the user to access to the URL, if needed
- password : the password to access to the URL, if needed
- headers : javascript object containing headers to be sent
- withCredentials : `false` by default; sends [credentials](http://www.w3.org/TR/XMLHttpRequest2/#user-credentials) with your XHR2 request ([more info in that post](https://dev.opera.com/articles/xhr2/#xhrcredentials))
- timeout : the timeout for the request in ms; `30000` by default
- attempts : the total number of times to attempt the request through timeouts; 1 by default; if you want to remove the limit set it to `null`
You can change the default data type with :
```js
qwest.setDefaultDataType('json');
```
If you want to make a call with another HTTP method, you can use the `map()` function :
```js
qwest.map('PATCH', 'example.com')
.then(function() {
// Blah blah
});
```
If you need to do a `sync` request, you must call `send()` at the end of your promise :
```js
qwest.get('example.com', {async: false})
.then(function() {
// Blah blah
})
.send();
```
Group requests
--------------
Sometimes we need to call several requests and execute some tasks after all of them are completed. You can simply do it by chaining your requests like :
```js
qwest.get('example.com/articles')
.get('example.com/users')
.post('example.com/login', auth_data)
.then(function(values) {
/*
Prints [ [xhr, response], [xhr, response], [xhr, response] ]
*/
console.log(values);
});
```
If an error is encountered then `catch()` will be called and all requests will be aborted.
Base URI
--------
You can define a base URI for your requests. The string will be prepended to the other request URIs.
```js
qwest.base = 'http://example.com';
// Will make a request to 'http://example.com/somepage'
qwest.get('/somepage')
.then(function() {
// Blah blah
});
```
Request limit
-------------
One of the greatest qwest functionnalities is the request limit. It avoids browser freezes and server overloads by freeing bandwidth and memory resources when you have a whole bunch of requests to do at the same time. Set the request limit and when the count is reached qwest will stock all further requests and start them when a slot is free.
Let's say we have a gallery with a lot of images to load. We don't want the browser to download all images at the same time to have a faster loading. Let's see how we can do that.
```html
```
```js
// Browsers are limited in number of parallel downloads, setting it to 4 seems fair
qwest.limit(4);
$('.gallery').children().forEach(function() {
var $this = $(this);
qwest.get($this.data('src'), {responseType: 'blob'})
.then(function(xhr, response) {
$this.attr('src', window.URL.createObjectURL(response));
$this.fadeIn();
});
});
```
If you want to remove the limit, set it to `null`.
CORS and preflight requests
---------------------------
According to [#90](https://github.com/pyrsmk/qwest/issues/90) and [#99](https://github.com/pyrsmk/qwest/issues/99), a CORS request will send a preflight `OPTIONS` request to the server to know what is allowed and what's not. It's because we're adding a `Cache-Control` header to handle caching of requests. The simplest way to avoid this `OPTIONS` request is to set `cache` option to `true`. If you want to know more about preflight requests and how to really handle them, read this : https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Aborting a request
------------------
```js
// Start the request
var request = qwest.get('example.com')
.then(function(xhr, response) {
// Won't be called
})
.catch(function(xhr, response) {
// Won't be called either
});
// Some code
request.abort();
```
Not that only works with asynchroneous requests since synchroneous requests are... synchroneous.
Set options to the XHR object
-----------------------------
If you want to apply some manual options to the `XHR` object, you can use the `before` option
```js
qwest.get('example.com', null, null, function(xhr) {
xhr.upload.onprogress = function(e) {
// Upload in progress
};
})
.then(function(xhr, response) {
// Blah blah blah
});
```
Handling fallbacks
------------------
XHR2 is not available on every browser, so, if needed, you can simply verify the XHR version with :
```js
if(qwest.xhr2) {
// Actions for XHR2
}
else {
// Actions for XHR1
}
```
Receiving binary data in older browsers
---------------------------------------
Getting binary data in legacy browsers needs a trick, as we can read it on [MDN](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers). In qwest, that's how we could handle it :
```js
qwest.get('example.com/file', null, null, function(xhr) {
xhr.overrideMimeType('text\/plain; charset=x-user-defined');
})
.then(function(response) {
// response is now a binary string
});
```
Compatibility notes
-------------------
According to this [compatibility table](https://kangax.github.io/compat-table/es5), IE7/8 do not support using `catch` and `delete` as method name because these are reserved words. If you want to support those browsers you should write :
```js
qwest.delete('example.com')
.then(function(){})
.catch(function(){});
```
Like this :
```js
qwest['delete']('example.com')
.then(function(){})
['catch'](function(){});
```
XHR2 does not support `arraybuffer`, `blob` and `document` response types in synchroneous mode.
The CORS object shipped with IE8 and 9 is `XDomainRequest`. This object __does not__ support `PUT` and `DELETE` requests and XHR2 types. Moreover, the `getResponseHeader()` method is not supported too which is used in the `auto` mode for detecting the reponse type. Then, the response type automatically fallbacks to `json` when in `auto` mode. If you expect another response type, please specify it explicitly. If you want to specify another default response type to fallback in `auto` mode, you can do it like this :
```js
qwest.setDefaultXdrResponseType('text');
```
Last notes
----------
- Blackberry 10.2.0 (and maybe others) can [log an error saying json is not supported](https://github.com/pyrsmk/qwest/issues/94) : set `responseType` to `auto` to avoid the issue
- the `catch` handler will be executed for status codes different from `2xx`; if no data has been received when `catch` is called, `response` will be `null`
- `auto` mode is only supported for `xml`, `json` and `text` response types; for `arraybuffer`, `blob` and `document` you'll need to define explicitly the `responseType` option
- if the response of your request doesn't return a valid (and recognized) `Content-Type` header, then you __must__ explicitly set the `responseType` option
- the default `Content-Type` header for a `POST` request is `application/x-www-form-urlencoded`, for `post` and `xhr2` data types
- if you want to set or get raw data, set `dataType` option to `text`
- as stated on [StackOverflow](https://stackoverflow.com/questions/8464262/access-is-denied-error-on-xdomainrequest), XDomainRequest forbid HTTPS requests from HTTP scheme and vice versa
- IE8 only supports basic request methods
License
-------
[MIT license](http://dreamysource.mit-license.org) everywhere!