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!