Now that we have a good idea of how to boost the performance of our JAX-RS services using HTTP caching, we now need to look at how to scale applications that update resources on our server. The way RESTful updates work is that the client fetches a representation of a resource through a GET request. It then modifies the representation locally and PUTs or POSTs the modified representation back to the server. This is all fine and dandy if there is only one client at a time modifying the resource, but what if the resource is being modified concurrently? Because the client is working with a snapshot, this data could become stale if another client modifies the resource while the snapshot is being processed.
The HTTP specification has a solution to this problem through the
use of conditional PUTs or POSTs. This technique is very similar to how cache revalidation and
conditional GETs work. The client first starts out by fetching the
resource. For example, let’s say our client wants to update a customer in
a RESTful customer directory. It would first start off by doing a
GET /customers/123 to pull down the current
representation of the specific customer it wants to update. The response
might look something like this:
HTTP/1.1 200 OK Content-Type: application/xml Cache-Control: max-age=1000 ETag: "3141271342554322343200" Last-Modified: Tue, 15 May 2009 09:56 EST <customer id="123">...</customer>
In order to do a conditional update, we need either an
Last-Modified header. ...