文档章节

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

Big_BoBo
 Big_BoBo
发布于 2015/12/27 21:24
字数 1003
阅读 1708
收藏 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
粉丝 52
博文 54
码字总数 22137
作品 0
杭州
高级程序员
spring+restful service

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

游宵
2014/04/25
0
1
为一个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 Boot中使用Swagger2生成RESTful API文档(转)

效果如下图所示: 添加Swagger2依赖 在中加入Swagger2的依赖 注意:如果是2.2版本的,有可能在右下角会出现错误,那么请升级为2.7版本的即可解决这个问题。 创建Swagger2配置类 在同级创建S...

easonjim
2017/09/13
0
0
SpringMVC+RestFul详细示例实战教程(实现跨域访问)

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

sihailoveyan
06/11
0
0
spring boot(2)起步依赖spring-boot-starter-*详解

--The core Spring Boot starter, including auto-configuration support, logging and YAML. --Spring Boot starter核心模块,包括自动配置支持,日志和YAML。 --Support for the “Advance......

刘胜球
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea新建springCloud项目(5)- 订单服务

1.创建订单api,如下: 2.创建订单实现逻辑 3.新建订单、订单商品表 -- 订单 create table `order_master` ( `order_id` varchar(32) not null, `buyer_name` varchar(32) not null comment......

monroeCode
19分钟前
1
1
游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章《游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案》,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以回溯之前的内容。本期内容,将会重点介...

UCloudTech
29分钟前
0
0
Mysql基本语法

一.联合主键 drop table CONTENT_AND_CATALOG;CREATE TABLE `tobebetter`.`CONTENT_AND_CATALOG` ( `ID` VARCHAR(120) NOT NULL , `CONTENT_ID` VARCHAR(120) , `CA......

我是菜鸟我骄傲
30分钟前
0
0
179. centos7 安装mariadb

1. centos7 中安装mariadb 1.1 执行安装 centos7 自带了mariadb yum -y install mariadb mariadb-server 1.2 启动mariadb systemctl start mariadb 1.3 设置开机启动 systemctl enable maria......

Lucky_Me
37分钟前
0
0
【AI实战】动手训练自己的目标检测模型(YOLO篇)

在前面的文章中,已经介绍了基于SSD使用自己的数据训练目标检测模型(见文章:手把手教你训练自己的目标检测模型),本文将基于另一个目标检测模型YOLO,介绍如何使用自己的数据进行训练。 ...

雪饼
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部