文档章节

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

BuWei1987
 BuWei1987
发布于 2015/12/27 21:24
字数 1003
阅读 6.3K
收藏 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完美地被格式化发回给解下来的查询中。

BuWei1987
粉丝 58
博文 57
码字总数 25408
作品 0
杭州
高级程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.7K
7
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.1K
18
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3

没有更多内容

加载失败,请刷新页面

加载更多

02-敏捷的核心价值观

敏捷金字塔 敏捷所包含的知识领域可以概括为一个金字塔结构,金字塔的最底层,也就是一切的根基是敏捷的核心价值观,也就是著名的《敏捷宣言》,中间支撑的部分是敏捷的12项原则,而最顶层则...

杨久成
06/18
0
0
你还不知道 OpenGL ES 和 EGL 的关系?

什么是 EGL EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenG...

ByteFlow
今天
5
0
Asp.net Core 微信小程序支付

最近要做一个微信小程序支付的功能 在网上找了一下 .net Core做微信支付的博客 和 demo 几乎没有 自己研究了好几天 参考了 很多 大牛的博客 勉强做出来了 因为参数都没有 比如 opid 小程序域...

osc_ix000whh
19分钟前
0
0
腾讯云 Serverless 衔接 Kafka 上下游数据流转实战

导语:腾讯云 CKafka 作为大数据架构中的关键组件,起到了数据聚合,流量削峰,消息管道的作用。在 CKafka 上下游中的数据流转中有各种优秀的开源解决方案。如 Logstash,File Beats,Spark...

腾讯云中间件
昨天
0
0
「真香警告」鱼头手摸手教你在小程序里用composition-api

使用 使用起来应该像是这个样子 wxue(options) setup 配置应该是包含一个setup选项是一个函数,返回的函数可以this.xxx调用,返回的数据可以this.data.xxx用到,如下 import { wxue, rea...

陈大鱼头
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部