Last active
December 21, 2019 10:34
-
-
Save hassanabbasi/38001ff3636c6437f8c6f66981f208d8 to your computer and use it in GitHub Desktop.
Generalized API Manager for Javascript based applications
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import axios from 'axios'; | |
import qs from 'qs'; | |
// Customized Axios object for API calls | |
var Api = axios.create({ | |
// NOTE: Replace the API URL | |
baseURL: 'http://api.example.com/', | |
responseType: 'json', | |
withCredentials: true | |
// Add whatever you want to configure Axios here | |
}); | |
// Allowed HTTP methods | |
var methods = ['get', 'post', 'put', 'delete', 'patch']; | |
// Add support for dynamically generated APIs | |
var apiHandler = function(url) { | |
return { | |
get: (target, name) => { | |
var apiURL = url || ''; | |
var apiCall = (params) => { | |
if (methods.indexOf(name) === -1) { | |
return new Proxy({}, apiHandler(`${apiURL}/${name}/${String(params)}`)); | |
} | |
return new Promise((resolve, reject) => { | |
if (name === 'get' && params) { | |
apiURL += `?${qs.stringify(params)}`; | |
} | |
Api[name](apiURL, params) | |
.then(response => { | |
// Resolve with response.data to only return data | |
// returned by API | |
resolve(response.data) | |
}) | |
.catch(error => { | |
// TODO: Logout user if server returns 401 (unauthorized) | |
// Or do other generalized error handling | |
reject(error) | |
}); | |
}); | |
} | |
apiCall.__proto__ = new Proxy({}, apiHandler(`${apiURL}/${name}`)); | |
return apiCall; | |
} | |
} | |
} | |
// Expose APIs | |
export default new Proxy({}, apiHandler()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Api from './Api' | |
// GET http://api.example.com/users | |
Api.users.get().then(()=>()) | |
// GET http://api.example.com/users?role[in][]=admin&role[in][]=editor | |
Api.users.get({ | |
role: { | |
in: ['admin', 'editor'] | |
} | |
}).then(()=>()) | |
// GET http://api.example.com/users/1 | |
Api.users(1).get().then(response => {}) | |
// GET http://api.example.com/users/1/banks/export | |
Api.users(1).banks.export.get().then(response => {}) | |
// GET http://api.example.com/users/1/banks/10 | |
Api.users(1).banks(10).get().then(response => {}) | |
// GET http://api.example.com/users/export | |
Api.users.export.get().then(response => {}) | |
// POST http://api.example.com/login | |
Api.login.post({ | |
username: 'hassanabbasi', | |
password: '12345' | |
}).then(response => {}) | |
// DELETE http://api.example.com/users/1 | |
Api.users(1).delete().then(response => {}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment