etag java_java – 在Spring MVC REST中的ETag处理

我正在考虑从Apache CXF RS与JAX RS切换到

Spring MVC REST,并查看Spring MVC REST当前正在处理ETag的方式的一些问题.也许我不明白,还是有更好的方式来实现JAX RS目前正在做的工作?

使用Apache CXF RS,在REST服务中评估最后修改的时间戳和ETag的条件(条件评估实际上相当复杂,请参见RFC 2616第14.24和14.26节,因此我很高兴为我做).代码看起来像这样:

@GET

@Path("...")

@Produces(MediaType.APPLICATION_JSON)

public Response findBy...(...,@Context Request request) {

... result = ...fetch-result-or-parts-of-it...;

final EntityTag eTag = new EntityTag(computeETagValue(result),true);

ResponseBuilder builder = request.evaluatePreconditions(lastModified,eTag);

if (builder == null) {

// a new response is required,because the ETag or time stamp do not match

// ...potentially fetch full result object now,then:

builder = Response.ok(result);

} else {

// a new response is not needed,send "not modified" status without a body

}

final CacheControl cacheControl = new CacheControl();

cacheControl.setPrivate(true); // store in private browser cache of user only

cacheControl.setMaxAge(15); // may stay unchecked in private browser cache for 15s,afterwards revalidation is required

cacheControl.setNoTransform(true); // proxies must not transform the response

return builder

.cacheControl(cacheControl)

.lastModified(lastModified)

.tag(eTag)

.build();

}

我尝试与Spring MVC REST相同的事情看起来像这样:

@RequestMapping(value="...",produces=MediaType.APPLICATION_JSON_VALUE)

public ResponseEntity<...> findByGpnPrefixCacheable(...) {

... result = ...fetch-result...;

// ... result = ...fetch-result-or-parts-of-it...; - can't fetch parts,must obtain full result,see below

final String eTag = "W/\""+computeETagValue(result)+"\""; // need to manually construct,as opposed to convenient JAX RS above

return ResponseEntity

.ok() // always say 'ok' (200)?

.cacheControl(

CacheControl

.cachePrivate()

.maxAge(15,TimeUnit.SECONDS)

.noTransform()

)

.eTag(eTag)

.body(result); // ETag comparison takes place outside controller(?),but data for a full response has already been built - that is wasteful!

}

即使不需要,我也需要先建立所有的数据以获得完整的响应.这使得在Spring MVC REST中使用的ETag远远不如它可能是有价值的.对我的理解,一个弱的ETag的想法是,建立它的价值可能是“便宜的”,并将其进行比较.在快乐的情况下,这可以防止服务器上的加载.在资源被修改的情况下,当然需要构建完整的响应.

在我看来,通过设计Spring MVC REST目前需要构建完整的响应数据,无论最终是否需要响应的主体.

所以,总结Spring MVC REST的两个问题:

>有等价于evaluatePreconditions()吗?

>是否有更好的方式构建ETag字符串?

谢谢你的想法!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以使用MinIO Java SDK来操作MinIO。以下是使用MinIO Java SDK通过ETag下载文件的示例代码: ```java import io.minio.MinioClient; import io.minio.errors.MinioException; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class DownloadFileByETag { public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException { String endpoint = "http://minio.example.com"; String accessKey = "YOUR-ACCESSKEYID-HERE"; String secretKey = "YOUR-SECRETACCESSKEY-HERE"; String bucketName = "your-bucketname"; String objectName = "path/to/your/object"; String etag = "d41d8cd98f00b204e9800998ecf8427e"; // Replace with your object's ETag try { MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey); if (minioClient.statObject(bucketName, objectName).etag().equals(etag)) { // ETag matches, download the object minioClient.getObject(bucketName, objectName, "/path/to/your/local/file"); System.out.println("Object downloaded successfully."); } else { // ETag does not match, do something else System.out.println("Object ETag does not match."); } } catch (MinioException e) { System.out.println("Error occurred: " + e); } } } ``` 这段代码首先创建了一个MinioClient对象,并使用该对象的`statObject`方法获取指定对象的ETag值。然后,如果ETag值与指定的值相同,则调用`getObject`方法下载该对象。否则,可以进行其他操作。需要注意的是,在实际应用,需要在代码处理异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值