Giacomo Balli profile picture
Giacomo Balli
The Mobile Guy

For founders and teams whose growth depends on mobile.
Clear judgment when AI, vendors, and product choices muddy the roadmap.

Find the Right Move LinkedIn

Cache API Calls

This code sample will allow you to cache API calls for a super fast UX.

function makeApiCall(url, cbk, apiCallneedsRefresh, args) {
   if (localStorage.getItem("apiResp-" + url) && !apiCallneedsRefresh && (!args || JSON.stringify(args) == "{}")) {
        console.log("Will use cached " + url + " API response.");
        var resp = JSON.parse(localStorage.getItem("apiResp-" + url));
        cbk(resp);
        return;
    }
    var req = new XMLHttpRequest();
   	if (args) {
        req.args = args;
        req.open("POST", url, true);
        //req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req.setRequestHeader("Content-type", "application/json");
    } else {
        req.open("GET", url, true);
    }
    req.url = url;
    req.onerror = function (e) {
        var errMsg="";
        if (e.position === 0 && e.totalSize === 0) {
           	errMsg="No connection ☹";
        } else {
            errMsg="API Error

" + JSON.stringify(e) + "
" + req.status + " - " + req.statusText; } alert(errMsg); console.log("API Error
" + JSON.stringify(e)); }; req.onload = function (evt) { if (req.status === 404) { alert("Whoops, something went wrong.
Resource not found."); return; } else if (req.status === 401) { alert("Unauthorized."); return; } else if (req.status === 500) { alert("Currently unavailable: server error"); return; } var resp = JSON.parse(evt.target.responseText); cbk(resp); if (!args) { localStorage.setItem("apiResp-" + url, evt.target.responseText); console.log("Api call to " + url + " cached.", resp); } else { console.log("Api call to " + url + " completed.", args, resp); } }; req.send(JSON.stringify(args)); }

Directions:
- url is the full url you want to retrieve.
- cbk is the callback function to be executed when a response is received.
- apiCallneedsRefresh is a boolean variable to force a fresh call.
- args is a JSON object to be POSTed.
- sample usage: makeApiCall("http://google.com/API/search", function(r){console.log(r);}, true, {name:"John",last_name:"Doe"});

Note:
This snippet focuses on iOS development. Make sure to verify/adapt any vendor prefixes. Back to main listing.

Published: Sun, Jan 10 2016 @ 18:23:03
Back to Blog