blob: 9d6f6ad35cf8858fcea490b2d313982ae6eb99f1 [file] [log] [blame]
[//]: # " Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved. "
[//]: # " "
[//]: # " This program and the accompanying materials are made available under the "
[//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at "
[//]: # " http://www.eclipse.org/org/documents/edl-v10.php. "
[//]: # " "
[//]: # " SPDX-License-Identifier: BSD-3-Clause "
Jersey HTTP PATCH
=================
### *Jersey HTTP PATCH Support Example*
This example demonstrates how to implement generic support for
[HTTP PATCH Method (RFC-5789)](https://tools.ietf.org/html/rfc5789)
via JAX-RS reader interceptor. The example has been created based on
[this Gerard Davison's blogentry] (http://kingsfleet.blogspot.co.uk/2014/02/transparent-patch-support-in-jax-rs-20.html).
The patch format supported by this example is [JSON Patch (RFC-6902)](http://tools.ietf.org/html/rfc6902).
Contents
--------
The mapping of the URI path space is presented in the following table:
URI path | Resource class | HTTP methods
------------------------ | ------------------- | --------------
**_/patchable-state_** | PatchableResource | GET, PATCH
As you can see in the table, there is only a single resource deployed in
this application, that supports `GET` and `PATCH` methods. The resource
represents a *patchable* state, which consists of 3 properties:
- a `title` text property,
- a `message` text property, and
- a `list` property that represents a list/array of text strings.
This state can be patch via HTTP GET method by sending the desired
patch/diff in the JSON Patch format as defined in RFC-6902, for example:
```javascript
[
{
"op" : "replace",
"path" : "/message",
"value" : "patchedMessage"
}, {
"op" : "add",
"path" : "/list/-",
"value" : "one"
}
]
```
This patch will instruct the resource to replace it's `message` property
content with a new `"patchedMessage"` text and also to append a new
`"one"` string value to the list of valued contained in the `list`
property.
(See `HttpPatchTest` for more details.)
Sample Response
---------------
You can apply a patch using curl:
> curl -v -X PATCH http://localhost:8080/http-patch/patchable-state -H "Content-Type:application/json-patch+json" -d '[{
> "op": "replace",
> "path": "/message",
> "value": "patchedMessage"
> }, {
> "op": "add",
> "path": "/list/-",
> "value": "one"
> }]'
The application will answer with a patched object:
```javascript
{
"list" : [ "one" ],
"message" : "patchedMessage",
"title" : ""
}
```
Running the Example
-------------------
Run the example as follows:
> mvn clean compile exec:java
This deploys the example using [Grizzly](http://grizzly.java.net/) container.
A [WADL description](http://wadl.java.net/#spec) may be accessed at the URL:
- <http://localhost:8080/http-patch/application.wadl>
The resource is available at
- <http://localhost:8080/http-patch/patchable-state>