有没有办法在 @Path 注释中指定查询参数?

Is there a way to specify query parameters in the @Path annotation?

我有一个 Quarkus 服务,我试图(在某种程度上)模仿 S3 API。

我注意到 S3 中的分段上传是这样的:

POST bucket.host.com /KEY?uploads // signifies that a multipart upload on KEY is starting
                                  // and returns an uploadId for it
PUT bucket.host.com /KEY?uploadId=UPLOADID&partNumber=2 // uploads part 2 of the file,
                                                        // content is in request body
PUT bucket.host.com /KEY?uploadId=UPLOADID&partNumber=1 // upload part 1
POST bucket.host.com /KEY?uploadId=UPLOADID // signifies that the multipart upload is completed

“原子”文件上传(即没有多部分,文件只是一次上传)“重用”PUT 路径,因此以这种方式上传文件只需在 URL 并跳过两个查询参数。

我不会使用“存储桶嵌入主机名”的方法,而是将其作为请求的一部分 URL。

所以我目前拥有的资源 class 看起来像这样(在我的例子中简化和存储桶称为“项目”,KEY 称为“路径”):

@Path("/fts")
class FileTransferService(
    @ConfigProperty(name = "fts.project.root")
    private val projectRoot: String
) {

    @POST
    @Path("{project}/{path:.*}")
    @Produces(MediaType.APPLICATION_JSON)
    fun multipartFileUpload(
        @PathParam project: String,
        @PathParam path: String,
        @QueryParam("uploads") uploads: String?,
        @QueryParam("uploadId") uploadId: String?
    ): String {
        // Here I'll have to check whether uploads or uploadId is set
        // and determine the path to take with some if/else statements.
    }

    @PUT
    @Path("{project}/{path:.*}")
    @Produces(MediaType.APPLICATION_JSON)
    fun upload(
        @PathParam project: String,
        @PathParam path: String,
        @QueryParam("uploadId") uploadId: String?,
        @QueryParam("partNumber") partNumber: String?,
        body: InputStream
    ): String {
        // Here I'll need to check uploadId and/or partNumber to determine
        // whether this is an "atomic file upload" or a single part of a 
        // multi part upload and determine the path to take with if/else again.
    }
}

正如您在上面代码的注释中看到的那样,我必须做一些 if/else 检查并根据是否设置查询参数走不同的路线。

这让我很烦恼。我宁愿有不同的@POST 方法,一种捕捉设置了 uploads 参数的情况,另一种捕捉设置了 uploadId 参数的情况。

我尝试了多种方法,其中一种方法指定了 QueryParameter,另一种方法没有,但这似乎不起作用。我在 quarkus 日志中收到一条信息消息,指出为路径找到了多个匹配项,并且随机选择了一个(可能只是第一个)。

所以我猜测,如果这完全可能的话,那就是通过某种方式将查询参数放入 @Path 注释中,但我一直无法找到我将如何做到这一点。一个可能的原因是这是不可能的,但我想在这里问一下并得到确认。

如果您想使用查询参数,您当前的版本是正确的。

您将无法使用 JAX-RS 做您想做的事。路径决定调用的方法,查询参数只是可选的附加信息。

如果您绝对希望根据参数的存在使用不同的方法,则需要使用路径参数。