Files
2015-06-26 12:33:19 -05:00

128 lines
3.8 KiB
JavaScript

import * as util from 'ionic/util';
/**
* The Http class makes it easy to send GET/POST/PUT/DELETE/PATCH requests
* and send/receive JSON (or anything else) through a simple API.
*
* Http uses the `fetch()` API underneath, or a polyfill if it's not natively supported.
*/
export class Http {
/**
* The raw fetch() operation.
*
* Generally, you want to use one of get()/post()/put()/delete() but
* this is useful if you want to do something crazy.
*
* @param url the URL to pass to fetch
* @param options the options to configure the fetch
* @return es6 promise from the fetch.
*/
static fetch(url, options) {
return fetch(url, options).then((response) => {
// status "0" to handle local files fetching (e.g. Cordova/Phonegap etc.)
if (response.status === 200 || response.status === 0) {
// We have a good response, let's check the response headers and return
// deserialized JSON or return the text from the response.
if (response.headers.get('Content-Type') === 'application/json') {
return response.json();
}
return response.text();
} else {
return Promise.reject(response, new Error(response.statusText));
}
}).catch((err) => {
return Promise.reject(err);
});
}
static _method(method, url, data, options, sendsJson) {
options = util.defaults(options, {
method: method,
headers: {
'Accept': 'application/json,text/plain,*/*',
},
body: (typeof data === 'string') ? data : JSON.stringify(data)
});
if(sendsJson) {
options.headers['Content-Type'] = 'application/json';
}
return Http.fetch(url, options);
}
/**
* Send a GET request to the given URL.
*
* By default, options sends the `Accept` header as `application/json,text/plain,* / *`,
*
* @param url the URL to POST to
* @param options the options to configure the post with.
* @return promise
*/
static get(url, options = {}) {
return Http._method('get', url, {}, options);
}
/**
* Send a POST request to the given URL.
*
* By default, options sends the `Accept` header as `application/json,text/plain,* / *`,
* and the `Content-Type` header as `application/json`
*
* @param url the URL to POST to
* @param options the options to configure the post with.
* @return promise
*/
static post(url, data = {}, options = {}) {
return Http._method('post', url, data, options, true);
}
/**
* Send a PUT request to the given URL.
*
* By default, options sends the `Accept` header as `application/json,text/plain,* / *`,
* and the `Content-Type` header as `application/json`
*
* @param url the URL to PUT to
* @param data the JSON data to send
* @param options the options to configure the post with.
* @return promise
*/
static put(url, data = {}, options = {}) {
return Http._method('put', url, data, options, true);
}
/**
* Send a DELETE request to the given URL.
*
* By default, options sends the `Accept` header as `application/json,text/plain,* / *`,
* and the `Content-Type` header as `application/json`
*
* @param url the URL to DELETE to
* @param data the JSON data to send
* @param options the options to configure the post with.
* @return promise
*/
static delete(url, data = {}, options = {}) {
return Http._method('delete', url, data, options, true);
}
/**
* Send a PATH request to the given URL.
*
* By default, options sends the `Accept` header as `application/json,text/plain,* / *`,
* and the `Content-Type` header as `application/json`
*
* @param url the URL to PATH to
* @param options the options to configure the post with.
* @return promise
*/
static patch(url, data = {}, options = {}) {
return Http._method('patch', url, data, options, true);
}
}