Java Reference
In-Depth Information
PUT
/customers/123
HTTP
/
1.1
If-Match: "3141271342554322343200"
If-Unmodified-Since: Tue, 15 May 2013 09:56 EST
Content-Type: application/xml
/customers/123
HTTP
<customer id="123">...</customer>
You are not required to send both the
If-Match
and
If-Unmodified-Since
headers. One or
the other is sufficient to perform a conditional PUT or POST. When the server receives this
request, it checks to see if the current
ETag
of the resource matches the value of the
If-
Match
header and also to see if the timestamp on the resource matches the
If-Unmodified-
Since
header. If these conditions are not met, the server will return an error response code of
412, “Precondition Failed.” This tells the client that the representation it is updating was
modified concurrently and that it should retry. If the conditions are met, the service performs
the update and sends a success response code back to the client.
JAX-RS and Conditional Updates
To do conditional updates with JAX-RS, you use the
Request.evaluatePreconditions()
method again. Let's look at how we can implement it within Java code:
@Path
(
"/customers"
)
public
public class
class
CustomerResource
CustomerResource
{
@Path
(
"{id}"
)
@PUT
@Consumes
(
"application/xml"
)
public
public
Response
updateCustomer
(
@PathParam
(
"id"
)
int
int
id
,
@Context
Request request
,
Customer update
) {
Customer cust
=
findCustomer
(
id
);
EntityTag tag
=
new
new
EntityTag
(
Integer
.
toString
(
cust
.
hashCode
()));
Date timestamp
= ...;
// get the timestamp
ResponseBuilder builder
=
request
.
evaluatePreconditions
(
timestamp
,
tag
);
iif
(
builder
!=
null
null
) {
// Preconditions not met!
return
return
builder
.
build
();
}
...
perform the update
...