【问题标题】:How to implement patch requests in RESTEasy?如何在 RESTEasy 中实现补丁请求?
【发布时间】:2014-08-11 23:18:54
【问题描述】:

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

【问题讨论】:

    标签: jax-rs resteasy


    【解决方案1】:

    要启用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 ...
      }
    ]
    

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

    【讨论】:

    • 感谢指点。这个实现是关于请求是否只包含一个更新的。但是,我正在寻找包含多个更新的单个请求的实现,这些更新可能与不同的资源有关。我可以实现解析公共资源中的输入流并对其他资源进行顺序调用的方式。但它不是优雅的解决方案。我在想,过滤器/拦截器进行解析并创建/生成多个请求。所有这些都应该并行运行。
    • 我更新了答案。请注意,资源类中发生的事情与 JAX-RS 无关。您可以执行简单的 sql-updates 或触发批处理作业,该批处理作业以高并行化方式执行此操作。这不是客户应该决定的。他只是在一个请求中说明应该更新哪些资源。
    • 我正在寻找解决方案,如果多个操作使用不同的路径。
    • 路径标识资源,一个 HTTP 请求只使用一个。 GET /customers/4711 返回客户 4711,而不是客户 0815 或产品 1313。与 PATCH 相同:如果您想更新,例如/customers 和 /products 您的客户需要拨打两个电话。
    • 我不确定这是否是一个好习惯,但 'path' 属性接受嵌套路径,因此您可以想象在 /customers 资源上发出 PATCH 请求并有多个操作引用多个客户。跨度>
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2014-04-20
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多