【发布时间】:2014-08-11 23:18:54
【问题描述】:
我想在一个 Patch 请求(json 格式)中实现多个操作。 RESTEasy 不支持开箱即用的补丁请求。如何提供自定义实现?
【问题讨论】:
我想在一个 Patch 请求(json 格式)中实现多个操作。 RESTEasy 不支持开箱即用的补丁请求。如何提供自定义实现?
【问题讨论】:
要启用PATCH,你需要定义一个注解@HttpMethod的注解:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {}
Bill Burke 的“RESTful Java with JAX-RS 2.0”一书中描述了一个完整的示例。源码可以在resteasy repository找到。
也许是 JAX-RS 2.1。将support PATCH out of the box。
更新:如果您想在一个请求中修补多个资源,您需要先识别它们。例如,如果您想为所有具有一定营业额的客户提供 VIP 身份,您可以使用如下资源方法:
@PATCH
@Path("/customers")
public Response patchCustomers(@QueryParam("minTurnover") Double minTurnover, InputStream is) {
// find and update customers
}
在实体主体中传递哪些信息取决于您。 RFC 要求应应用于资源的“一组更改”。这可以是简单的text/plain,比如update: vip=true。
此类更新的标准格式是 json-patch:
PATCH /customers?minTurnover=1000 HTTP/1.1
Content-Type: application/json-patch
[
{
"op" : "replace",
"path" : "/vip",
"value" : "true"
},
{
... more operations ...
}
]
请注意,应将同一组操作应用于所有已识别的资源。
【讨论】:
GET /customers/4711 返回客户 4711,而不是客户 0815 或产品 1313。与 PATCH 相同:如果您想更新,例如/customers 和 /products 您的客户需要拨打两个电话。