blob: 74a5eaaf3bcba18c1bc7a38a9310305327b63b24 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
import _ from 'underscore';
/**
* Default options for any request
* @type {{credentials: string}}
*/
const OPTIONS = {
type: 'GET',
credentials: 'same-origin'
};
/**
* Default request headers
* @type {{Accept: string}}
*/
const HEADERS = {
'Accept': 'application/json'
};
/**
* Create a query string from an object
* @param {object} parameters
* @returns {string}
*/
function queryString (parameters) {
return Object.keys(parameters)
.map(key => {
return `${encodeURIComponent(key)}=${encodeURIComponent(parameters[key])}`;
})
.join('&');
}
/**
* Request
*/
class Request {
constructor (url) {
this.url = url;
this.options = {};
this.headers = {};
}
submit () {
let url = this.url;
let options = _.defaults(this.options, OPTIONS);
let headers = _.defaults(this.headers, HEADERS);
options.headers = headers;
if (this.data) {
if (options.type === 'GET') {
url += '?' + queryString(this.data);
} else {
options.body = queryString(this.data);
}
}
return window.fetch(url, options);
}
setData (data) {
this.data = data;
return this;
}
}
/**
* Make a request
* @param {string} url
* @returns {Request}
*/
export function request (url) {
return new Request(url);
}
/**
* Check that response status is ok
* @param response
* @returns {*}
*/
export function checkStatus (response) {
if (response.status >= 200 && response.status < 300) {
return response;
} else {
var error = new Error(response.status);
error.response = response;
throw error;
}
}
/**
* Parse response as JSON
* @param response
* @returns {object}
*/
export function parseJSON (response) {
return response.json();
}
/**
* Shortcut to do a GET request and return response json
* @param url
* @param data
*/
export function getJSON (url, data) {
return request(url)
.setData(data)
.submit()
.then(checkStatus)
.then(parseJSON);
}
|