zapier/fetch

Name: fetch

Owner: Zapier

Description: A window.fetch JavaScript polyfill.

Created: 2015-04-21 15:51:42.0

Updated: 2015-04-21 15:53:06.0

Pushed: 2015-04-21 15:53:04.0

Homepage: null

Size: 229

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

window.fetch polyfill

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.

wer install fetch

You'll also need a Promise polyfill for older browsers.

wer install es6-promise

This can also be installed with npm.

m install whatwg-fetch --save

(For a node.js implementation, try node-fetch)

Usage

The fetch function supports any HTTP method. We'll focus on GET and POST example requests.

HTML
h('/users.html')
hen(function(response) {
return response.text()
.then(function(body) {
document.body.innerHTML = body

JSON
h('/users.json')
hen(function(response) {
return response.json()
.then(function(json) {
console.log('parsed json', json)
.catch(function(ex) {
console.log('parsing failed', ex)

Response metadata
h('/users.json').then(function(response) {
nsole.log(response.headers.get('Content-Type'))
nsole.log(response.headers.get('Date'))
nsole.log(response.status)
nsole.log(response.statusText)

Post form
form = document.querySelector('form')

h('/query', {
thod: 'post',
dy: new FormData(form)

Post JSON
h('/users', {
thod: 'post',
aders: {
'Accept': 'application/json',
'Content-Type': 'application/json'

dy: JSON.stringify({
name: 'Hubot',
login: 'hubot',


File upload
input = document.querySelector('input[type="file"]')

form = new FormData()
.append('file', input.files[0])
.append('user', 'hubot')

h('/avatars', {
thod: 'post',
dy: form

Success and error handlers

This causes fetch to behave like jQuery's $.ajax by rejecting the Promise on HTTP failure status codes like 404, 500, etc. The response Promise is resolved only on successful, 200 level, status codes.

tion status(response) {
 (response.status >= 200 && response.status < 300) {
return response

row new Error(response.statusText)


tion json(response) {
turn response.json()


h('/users')
hen(status)
hen(json)
hen(function(json) {
console.log('request succeeded with json response', json)
.catch(function(error) {
console.log('request failed', error)

Response URL caveat

The Response object has a URL attribute for the final responded resource. Usually this is the same as the Request url, but in the case of a redirect, its all transparent. Newer versions of XHR include a responseURL attribute that returns this value. But not every browser supports this. The compromise requires setting a special server side header to tell the browser what URL it just requested (yeah, I know browsers).

onse.headers['X-Request-URL'] = request.url

If you want response.url to be reliable, you'll want to set this header. The day that you ditch this polyfill and use native fetch only, you can remove the header hack.

Browser Support

Chrome | Firefox | IE | Opera | Safari — | — | — | — | — | Latest ? | Latest ? | 9+ ? | Latest ? | 6.1+ ? |


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.