In an effort to put more content on this blog, i’ve decided to try and take some simplified quick and dirty versions of code i’ve written or concepts that i’ve re-used in various scenarios. Below is an example function, with commenting, of what a starter function to make a server side request to a JSON api might look like!
function api_request($endpoint='', $param=array(), $args=array(), $lifespan=HOUR_IN_SECONDS){
    $apikey = 'your api key here'; // maybe get from the db
    $base   = 'http://my.api.base/api'; // maybe use a const in a class
    // ensure we have what we need
    if ( !$apikey ) return new WP_Error('request', 'no api key', 'APIKEY');
    // prepare url
    $url = trailingslashit($base) . $endpoint;
    // prepare url param plus defaults
    $param = wp_parse_args($param, array(
        'access_key' => $apikey // do various filters or authenticate
    ));
    // prepare request args plus defaults
    $args = wp_parse_args($args, array());
    // build the full url
    $full_url = add_query_arg($param, $url);
    // first check for a cached version
    if ( $lifespan ) {
        $key    = $endpoint .'::'. md5($full_url);
        $cached = get_transient($key);
        if ( $cached !== false ) {
            return $cached;
        }
    }
    // make the request
    $request = wp_remote_get($full_url, $args);
    // parse the json response
    $response = json_decode( wp_remote_retrieve_body($request) );
    // check for request errors i.e. unauthorized, 503 error, etc
    if ( is_wp_error( $request ) || ( !in_array($request[ 'response' ][ 'code' ], array( 200, 201, 204 )) ) ) {
        return new WP_Error("request", 'unknown', '000');
    }
    // check for api definied errors i.e. $response->success, $response->error, etc
    if ( empty($response) ) {
        return new WP_Error('type', 'message', 'code');
    }
    // save a cached version
    if ( $lifespan ) {
        set_transient( $key, $response, HOUR_IN_SECONDS );
    }
    return $response;
}
All in all, this is pretty light weight, and very quickly a custom table and caching via cron would be a better option than making a request on the fly and caching it after the fact. Hopefully the concepts here are helpful none the less!