有没有办法在 @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 做您想做的事。路径决定调用的方法,查询参数只是可选的附加信息。
如果您绝对希望根据参数的存在使用不同的方法,则需要使用路径参数。
我有一个 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 做您想做的事。路径决定调用的方法,查询参数只是可选的附加信息。
如果您绝对希望根据参数的存在使用不同的方法,则需要使用路径参数。