文档章节

RESTful API中的header的作用(从Spring Data REST文档中译出)

Big_BoBo
 Big_BoBo
发布于 2015/12/27 21:24
字数 1003
阅读 1785
收藏 11

        好久没有写博文了,最近想把自己的脚手架给全面restful了,正在研究rest api的验证授权,也看了下Spring Data REST这个框架,有意是从它下手。看到文档中关于rest中http header的一章自己获益不少,就翻译了下贡献出来,希望对大家有点帮助。

9. 根据headers在一定条件下才会诱发的操作

这个章节展示了Spring Data REST使用标准的HTTP headers来提升性能,条件化操作,和简单地展现出一个更精致的前端。

9.1. ETag, If-Match, and If-None-Match headers

ETag header提供了一个给资源加标签的方式,这可以阻止客户端覆盖彼此的操作同时也提供了减少不必要的调用的可能。

Example 3. A POJO with a version number

public class Sample {
    @Version Long version;
    Sample(Long version) {
        this.version = version;
    }
}

Spring Data Common的@Version 注解标记这个域是一个版本标识。
这个POJO,当被Spring Data REST作为一个REST资源导出时,将会有一个值为这个version域的ETag头。
我们可以在PUT,PATCH,或者DELETE那个资源时像这样有条件地加上一个If-Match header:

curl -v -X PATCH -H 'If-Match: <value of previous ETag>' ...


只有在资源的当前ETag状态匹配你请求时的If-Match header时,你的操作才会被执行。这阻止了客户端互相覆盖彼此。两个不同的客户端能够获取资源并且他们当时的资源响应header中拥有完全相同的ETag。如果他们中的一个客户端更新了这个资源,它将会产生一个新的ETag在应答中。但是第一次获取资源的另一个客户端仍然拥有老的header。如果他尝试去更新并带着If-Match header,这个更新操作将会失败因为他们的ETag已经无法匹配上。取而代之的是,这个客户端会收到HTTP 412 Precondition Failed的消息。这个客户端接下来可以获取并处理这个错误消息。


If-None-Match header提供了另一个方案。相比有选择性地更新,If-None-Match允许有选择性地查询。

curl -v -H 'If-None-Match: <value of previous etag>' ...

这个命令默认会执行一个GET http调用。Spring Data REST将会在执行GET请求时检查If-None-Match headers,如果header 匹配了ETag,它将会总结出没有什么被修改过,而不会发送一个资源的拷贝给前端,只会发回一个HTTP 304 Not Modified状态码。语义上的解释是,当它读到“当这个支持的header的值不匹配服务端的version时,发送整个资源的数据;不然的话,不要发送数据回来。”

9.2. If-Modified-Since header

If-Modified-Since header提供了一个当上一次请求发生时检查一个资源是否被更新过来避免重新发送同样数据的方法。

Example 4. The last modification date captured in a domain type

@Document
public class Receipt {
    public @Id String id;
    public @Version Long version;
    public @LastModifiedDate Date date; 
    public String saleItem;
    public BigDecimal amount;
}

Spring Data Common的@ LastModifiedDate 注解允许用多种格式描述这个信息(JodaTime’s DateTime, legacy Java Date and Calendar, JDK8 date/time types, as well as long/Long

带了这个域,Spring Data REST将会像这样返回一个Last-Modified 的头:

Last-Modified: Wed, 24 Jun 2015 20:28:15 GMT

这个值可以被捕获和用作后面的查询来避免在资源没有被更新的情况下两次获得同样的数据。

curl -H "If-Modified-Since: Wed, 24 Jun 2015 20:28:15 GMT" ...

用这个简单的命令,你正在询问的是 一个资源在那个时间开始之后被更新了话,重新获取它。如果是,你将会获得一个经过校正的Last-Modified header来更新你的客户端。如果不是,你将会获得一个HTTP 304 Not Modified 的状态码。

这个header完美地被格式化发回给解下来的查询中。

© 著作权归作者所有

共有 人打赏支持
Big_BoBo
粉丝 53
博文 54
码字总数 22137
作品 0
杭州
高级程序员
私信 提问
Spring REST Docs 1.2.6.RELEASE 与 2.0.3.RELEASE 发布

Spring REST Docs 1.2.6.RELEASE 与 2.0.3.RELEASE 发布了,Spring REST Docs 是 RESTful 服务的测试驱动文档,使用 Asciidoctor 手工编写内容结合使用 Spring MVC Test 框架自动生成示例,轻...

h4cd
12/12
0
0
为一个REST服务使用Spring Security的基本和摘要认证

原创翻译自:http://www.baeldung.com/2011/11/20/basic-and-digest-authentication-for-a-restful-service-with-spring-security-3-1/ 简介 这篇文章讨论的是如何在一个相同URI结构的REST ......

Big_BoBo
2014/01/16
0
0
spring+restful service

Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述...

游宵
2014/04/25
0
1
【转】使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

简介: Spring,构建 Java™ 平台和 Enterprise Edition (Java EE) 应用程序的著名框架,现在在其模型-视图-控制器(Model-View-Controller ,MVC)层支持具象状态传输 (REST)。RESTful web...

老盖
2011/08/25
2.1K
0
SpringMVC+RestFul详细示例实战教程(实现跨域访问)

一、理解 REST REST(Representational State Transfer),中文翻译叫“表述性状态转移”。是 Roy Thomas Fielding 在他2000年的博士论文中提出的。它与传统的 SOAP Web 服务区别在于,REST关...

sihailoveyan
06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
3
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
7
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部