As a Hypermedia API, instead of coding to individual endpoints, you navigate through the API using the contextual links called link relationships that are returned with responses, stepping through the API. This can seem a bit "chatty" at first, but the number and size of requests needed can be minimised with proper use of local caching and bookmarks.
ETags and Local Cache
The API includes an ETag header field with most responses, which acts as a unique identifier for the resource in it's current state at that particular URI. If a change is made to that resource then a new ETag is generated to represent it's updated state. You could think of it as a fingerprint for the resource request, and it provides a way to quickly compare if a given resource is identical on the server to one you may have in local cache. Many responses also include a
Last-Modified header representing the last time that the resource was modified.
HTTP/1.1 200 OK Cache-Control: private, must-revalidate Content-Type: application/hal+json Date: Mon, 5 Sep 2016 12:00:00 GMT ETag: W/"381698ed67bf92c4563fif9a949dc91d8d9b0979" Last-Modified: Fri, 2 Sep 2016 12:00:00 -0700
After receiving the ETag in a given response, if you perform a
GET request to that same URI, you would pass back the ETag value you previously received as an
If-None-Match header. If you'd prefer, you can instead pass an
If-Modified-Since header with the
Last-Modified value if it was provided. While both may be returned in a response - only one of the values need to be provided.
If-None-Match: W/"381698ed67bf92c4563fif9a949dc91d8d9b0979" If-Modified-Since: Fri, 2 Sep 2016 12:00:00 -0700
The server will then compare this identifier with the current server representation of the resource. If it matches, and so the resource hasn't changed, the server will issue a
304 Not Modified response with no body. In this instance, you would use the locally cached version of the resource. If it doesn't match, then the normal
200 OK response will be received with the resource included in the body.
To make proper use of the ETag, you need to cache the resource locally to use if the server responds that it hasn't changed. Generally speaking, the local caching and ETag handling will be taken care of through a library. For example, our PHP FoxyClient library makes use of Guzzle and it's CacheSubscriber plugin which looks after storing responses and handling the respective headers. If you're using a different language for communicating with the API, we definitely recommend making use of a HTTP library with either caching support or plugins that add it.
Within the API, there are some common relations that you will be hitting regularly. For example, if you're working with a store, the main store URI and it's relations like transactions, coupons, categories, etc., could be regularly accessed. As a Hypermedia API, we don't suggest hard-coding these URI's, but you could bookmark them to allow you to quickly access them.
Let's use an example of wanting to access a store's transactions. Using an
access_token that has a
store_full_access scope, you would first connect to the API homepage, then connect to the
fx:store URI and finally the
fx:transactions URI - for a total of three requests. Using local cache as detailed above would mean subsequent requests would probably return a
304 Not Modified response, but we could still even skip them by using bookmarks.
To make use of bookmarking, you temporarily store the common URI's you access into the users session. So using the transactions example from above - you could first check if the
fx:transactions relation exists in the session and load it directly if it is. Otherwise if not, you would make the needed requests and bookmark the URI's to the session as you go for next time.