问题 如何在RESTEasy中实现补丁请求?


我想在一个Patch请求(json格式)中实现多个操作。 RESTEasy不支持开箱即用的补丁请求。如何提供自定义实现?


4318
2017-08-11 23:18


起源



答案:


启用 PATCH 你需要定义一个带注释的注释 @HttpMethod

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {}

Bill Burke的书“使用JAX-RS 2.0的RESTful Java”中描述了一个完整的例子。源代码可以在。中找到 resteasy存储库

也许是JAX-RS 2.1。将 支持PATCH开箱即用

更新: 如果要在一个请求中修补多个资源,则需要先识别它们。例如,如果您想为所有客户提供一定的营业额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 /customers?minTurnover=1000 HTTP/1.1
Content-Type: application/json-patch

[
  { 
    "op" : "replace", 
    "path" : "/vip", 
    "value" : "true" 
  },
  {
    ... more operations ...
  }
]

请注意,应将同一组操作应用于所有已识别的资源。


11
2017-08-12 06:49



谢谢你的指点。该实现讨论了请求是否仅包含一个更新。但是,我正在寻找包含多个更新的单个请求的实现,这可能与不同的资源有关。我可以通过解析公共资源中的输入流并对其他资源进行顺序调用来实现。但它不是优雅的解决方案。我在想,过滤器/拦截器会进行解析并创建/生成多个请求。所有人都应该并行。 - user2932387
我更新了答案。请注意,资源类中发生的事情与JAX-RS无关。您可以执行简单的SQL更新或触发批处理作业,以高并行化执行此操作。这不是客户应该决定的。他只是在一个请求中告诉我应该更新哪些资源。 - lefloh
如果多个操作使用不同的路径,我正在寻找解决方案。 - user2932387
路径标识资源,HTTP请求仅使用一个。 GET /customers/4711 返回客户4711而不是客户0815或产品1313.与...相同 PATCH:如果您想要更新,例如: /客户和/产品客户需要拨打两个电话。 - lefloh
我不确定这是否是一个好习惯,但'path'属性接受嵌套路径,因此您可以想象在/ customers资源上发出PATCH请求并且有多个操作引用多个客户。 - botchniaque


答案:


启用 PATCH 你需要定义一个带注释的注释 @HttpMethod

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {}

Bill Burke的书“使用JAX-RS 2.0的RESTful Java”中描述了一个完整的例子。源代码可以在。中找到 resteasy存储库

也许是JAX-RS 2.1。将 支持PATCH开箱即用

更新: 如果要在一个请求中修补多个资源,则需要先识别它们。例如,如果您想为所有客户提供一定的营业额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 /customers?minTurnover=1000 HTTP/1.1
Content-Type: application/json-patch

[
  { 
    "op" : "replace", 
    "path" : "/vip", 
    "value" : "true" 
  },
  {
    ... more operations ...
  }
]

请注意,应将同一组操作应用于所有已识别的资源。


11
2017-08-12 06:49



谢谢你的指点。该实现讨论了请求是否仅包含一个更新。但是,我正在寻找包含多个更新的单个请求的实现,这可能与不同的资源有关。我可以通过解析公共资源中的输入流并对其他资源进行顺序调用来实现。但它不是优雅的解决方案。我在想,过滤器/拦截器会进行解析并创建/生成多个请求。所有人都应该并行。 - user2932387
我更新了答案。请注意,资源类中发生的事情与JAX-RS无关。您可以执行简单的SQL更新或触发批处理作业,以高并行化执行此操作。这不是客户应该决定的。他只是在一个请求中告诉我应该更新哪些资源。 - lefloh
如果多个操作使用不同的路径,我正在寻找解决方案。 - user2932387
路径标识资源,HTTP请求仅使用一个。 GET /customers/4711 返回客户4711而不是客户0815或产品1313.与...相同 PATCH:如果您想要更新,例如: /客户和/产品客户需要拨打两个电话。 - lefloh
我不确定这是否是一个好习惯,但'path'属性接受嵌套路径,因此您可以想象在/ customers资源上发出PATCH请求并且有多个操作引用多个客户。 - botchniaque