overleaf/services/web/frontend/js/infrastructure/fetch-json.js
Eric Mc Sween d0b624d419 Merge pull request #3391 from overleaf/ta-fetch-json
Add fetch-json Helper for React

GitOrigin-RevId: ac1ad925b8b02377109aeacc973b00322fe2895c
2020-11-19 03:04:30 +00:00

48 lines
1.3 KiB
JavaScript

// fetch wrapper to make simple JSON requests:
// - send the CSRF token in the request
// - set the JSON content-type in the request headers
// - throw errors on non-ok response
// - parse JSON response body, unless response is empty
export function getJSON(path, options) {
return fetchJSON(path, { ...options, method: 'GET' })
}
export function postJSON(path, options) {
return fetchJSON(path, { ...options, method: 'POST' })
}
export function deleteJSON(path, options) {
return fetchJSON(path, { ...options, method: 'DELETE' })
}
export default function fetchJSON(
path,
{ body = {}, headers = {}, method = 'GET', ...otherOptions }
) {
const options = {
...otherOptions,
headers: {
...headers,
'Content-Type': 'application/json',
'X-Csrf-Token': window.csrfToken
},
method
}
if (method !== 'GET' && method !== 'HEAD') {
options.body = JSON.stringify(body)
}
return fetch(path, options)
.then(response => {
if (!response.ok) throw new Error(response.status)
// get the response as text first as .json() fails on empty responses.
// (e.g. 204 responses)
return response.text()
})
.then(responseText => {
return responseText ? JSON.parse(responseText) : responseText
})
}