Changes from original
The original library was changed to support the following:
- Converted to UMD support.
- Module returns a
functionthat contains, as static properties, the respective polyfill:Headers,Request,Responseandfetch. Calling this function directly with an object on input will add those polyfills components to the given object. - Support for
.abort() - Support for
onProgressinput options. Ability to monitor content being uploaded
These items above make this version of the library non-standard. A little more about the change:
UMD Support
Adds support for AMD (define), module.exports as well as polyfill of global object. When global object is polyfilled, Global object will also have a property called fetchPolyfill which holds the functionality of this library (case you would like to use it instead of the version provided nativelly).
Support for .abort
The promise returned from .fetch() will have an additional method called abort that can be called to abort an inflight request.
Support for onProgress
An input option of onProgress can be defined to monitor upload activity. Option should be a Function whic is called every time the xhr.upload object triggers an progress event.
Examples
defined(["fetch"], function(fetchPolyfill){
var fetch = fetchPolyfill.fetch;
...
})
Load in the browser where .fetch() API alrady exists:
window.fetchPolyfill.fetch();// call polyfill .fetch()
Add the fetch method and associated Classes to a given object. Use it to extend your classes.
var myObject = {};
window.fetchPolyfill(myObject);
window.fetch polyfill
This project adheres to the [Open Code of Conduct][code-of-conduct]. By participating, you are expected to uphold this code. [code-of-conduct]: http://todogroup.org/opencodeofconduct/#fetch/[email protected]
The global fetch function is an easier way to make web requests and handle
responses than using an XMLHttpRequest. This polyfill is written as closely as
possible to the standard Fetch specification at https://fetch.spec.whatwg.org.
Installation
Available on Bower as fetch.
$ bower install fetchYou'll also need a Promise polyfill for older browsers.
$ bower install es6-promiseThis can also be installed with npm.
$ npm install whatwg-fetch --saveFor a node.js implementation, try node-fetch.
For use with webpack, refer to Using WebPack with shims and polyfills.
Usage
The fetch function supports any HTTP method. We'll focus on GET and POST
example requests.
HTML
fetch('/users.html')
.then(function(response) {
return response.text()
}).then(function(body) {
document.body.innerHTML = body
})JSON
fetch('/users.json')
.then(function(response) {
return response.json()
}).then(function(json) {
console.log('parsed json', json)
}).catch(function(ex) {
console.log('parsing failed', ex)
})Response metadata
fetch('/users.json').then(function(response) {
console.log(response.headers.get('Content-Type'))
console.log(response.headers.get('Date'))
console.log(response.status)
console.log(response.statusText)
})Post form
var form = document.querySelector('form')
fetch('/users', {
method: 'post',
body: new FormData(form)
})Post JSON
fetch('/users', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Hubot',
login: 'hubot',
})
})File upload
var input = document.querySelector('input[type="file"]')
var data = new FormData()
data.append('file', input.files[0])
data.append('user', 'hubot')
fetch('/avatars', {
method: 'post',
body: data
})Caveats
The fetch specification differs from jQuery.ajax() in mainly two ways that
bear keeping in mind:
-
The Promise returned from
fetch()won't reject on HTTP error status even if the response is a HTTP 404 or 500. Instead, it will resolve normally, and it will only reject on network failure, or if anything prevented the request from completing. -
By default,
fetchwon't send any cookies to the server, resulting in unauthenticated requests if the site relies on maintaining a user session.
Handling HTTP error statuses
To have fetch Promise reject on HTTP error statuses, i.e. on any non-2xx
status, define a custom response handler:
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response
} else {
var error = new Error(response.statusText)
error.response = response
throw error
}
}
function parseJSON(response) {
return response.json()
}
fetch('/users')
.then(checkStatus)
.then(parseJSON)
.then(function(data) {
console.log('request succeeded with JSON response', data)
}).catch(function(error) {
console.log('request failed', error)
})Sending cookies
To automatically send cookies for the current domain, the credentials option
must be provided:
fetch('/users', {
credentials: 'same-origin'
})This option makes fetch behave similar to XMLHttpRequest with regards to
cookies. Otherwise, cookies won't get sent, resulting in these requests not
preserving the authentication session.
Use the include value to send cookies in a cross-origin resource sharing (CORS) request.
fetch('https://example.com:1234/users', {
credentials: 'include'
})Receiving cookies
Like with XMLHttpRequest, the Set-Cookie response header returned from the
server is a forbidden header name and therefore can't be programatically
read with response.headers.get(). Instead, it's the browser's responsibility
to handle new cookies being set (if applicable to the current URL). Unless they
are HTTP-only, new cookies will be available through document.cookie.
Obtaining the Response URL
Due to limitations of XMLHttpRequest, the response.url value might not be
reliable after HTTP redirects on older browsers.
The solution is to configure the server to set the response HTTP header
X-Request-URL to the current URL after any redirect that might have happened.
It should be safe to set it unconditionally.
# Ruby on Rails controller example
response.headers['X-Request-URL'] = request.urlThis server workaround is necessary if you need reliable response.url in
Firefox < 32, Chrome < 37, Safari, or IE.
Browser Support
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|
| Latest |
Latest |
10+ |
Latest |
6.1+ |




