Skip to content

Instantly share code, notes, and snippets.

@lukaszb
Last active May 15, 2019 02:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save lukaszb/35af18fed009310e581e050589d0677b to your computer and use it in GitHub Desktop.
Save lukaszb/35af18fed009310e581e050589d0677b to your computer and use it in GitHub Desktop.
es6 http client using fetch
import 'whatwg-fetch'
import Auth from './Auth';
import Url from 'url-parse';
const API_URL = process.env.API_URL
const http = {
get: get,
getAuthed: getAuthed,
post: post,
postAuthed: postAuthed,
getDefaultHeaders: getDefaultHeaders,
getApiUrl: getApiUrl,
}
window.http = http
export default http
function post(url, data, extraHeaders, opts) {
extraHeaders = extraHeaders || {}
opts = opts || {}
let request = performRequest(url, {
method: 'POST',
headers: mergeHeaders(getDefaultHeaders(), extraHeaders),
body: JSON.stringify(data),
})
if (opts.returnRawRequest) {
return request
} else {
return processRequest(request)
}
}
function get(url, extraHeaders, opts) {
extraHeaders = extraHeaders || {}
opts = opts || {}
let request = performRequest(url, {
method: 'GET',
headers: mergeHeaders(getDefaultHeaders(), extraHeaders),
})
if (opts.returnRawRequest) {
return request
} else {
return processRequest(request)
}
}
function getAuthed(url, opts) {
return get(url, getAuthHeaders(), opts)
}
function postAuthed(url, data, opts) {
return post(url, data, getAuthHeaders(), opts)
}
function getAuthHeaders() {
let token = Auth.getAuthToken()
if (token) {
return {Authorization: `Token ${token}`}
} else {
return {}
}
}
function performRequest(url, opts) {
url = getApiUrl(url)
opts = opts || {}
return fetch(url, opts)
}
export function getApiUrl(url) {
var parsedUrl = new Url(url)
if (parsedUrl.href !== url) {
url = urljoin(API_URL, url)
}
return url
}
function isPath(url) {
let parsed = new Url(url)
//console.log(" => isPath parsed:", parsed);
return !parsed.protocol
}
function urljoin(baseUrl, path) {
if (baseUrl && baseUrl[baseUrl.length - 1] === '/') {
baseUrl = baseUrl.slice(0, baseUrl.length - 1)
}
if (path && path[0] === '/') {
path = path.slice(1)
}
return [baseUrl, path].join('/');
}
function processRequest(request) {
return request
.then((response) => {
let promise = response.json()
let successPromise = promise.then((data) => {
response.data = data
return response
})
if (response.status >= 200 && response.status < 400) {
return successPromise
} else {
return promise.then(err => { throw response })
}
})
}
function mergeHeaders(defaultHeaders, headers) {
var result = Object.assign({}, defaultHeaders, headers)
for (const key in headers) {
if (headers[key] === null) {
delete result[key]
}
}
return result
}
function getDefaultHeaders() {
return {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment