文档章节

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

Big_BoBo
 Big_BoBo
发布于 2015/12/27 21:24
字数 1003
阅读 1698
收藏 11
点赞 1
评论 0

        好久没有写博文了,最近想把自己的脚手架给全面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 Boot中使用Swagger2生成RESTful API文档(转)

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

easonjim ⋅ 2017/09/13 ⋅ 0

SpringMVC+RestFul详细示例实战教程(实现跨域访问)

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

sihailoveyan ⋅ 06/11 ⋅ 0

bboss elasticsearch v5.0.6.2 发布

The best elasticsearch highlevel java rest api-----bboss bboss elasticsearch v5.0.6.2 发布 v5.0.6.2新增功能及改进: 1.升级最新的bboss版本到5.0.5.7 2.新增bboss es rest boot模块,......

bboss ⋅ 04/29 ⋅ 0

springmvc学习笔记(19)-RESTful支持

springmvc学习笔记(19)-RESTful支持 标签: springmvc [TOC] 本文介绍RESTful的概念,并通过一个小例子展示如何编写RESTful风格的controller和配置前端控制器,最后展示静态资源的解析 概念 ...

brianway ⋅ 2016/03/16 ⋅ 0

spring+restful service

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

游宵 ⋅ 2014/04/25 ⋅ 0

Activiti rest api 使用

题外: 设计器修改为基于H5的了,有点小幸福~~ 哈哈 版本信息:5.19.0 REST主要核心包在源码 modules 下面 主要三个部分 1. activiti-common-rest 基本设置,内容较少 2. activiti-rest(旧的...

triankg ⋅ 2016/01/22 ⋅ 0

【2016-05-08】Jersey vs. SpringMVC

当前Web Service 常用的风格有两种,RESTful风格和RPC风格。 一、RESTful与RPC简介 RPC的中心是方法,REST的中心是资源。 RPC:其中RPC风格中常见的有XML-RPC和JSON-RPC,JSON以其简洁、传输...

rathan0 ⋅ 2016/05/08 ⋅ 0

第二章——Spring Boot启动器与依赖管理

强烈推荐选择支持依赖管理和可以发布到“Maven中央”仓库的构建系统。推荐使用Maven或Gradle。Spring Boot可以使用其他构建系统(例如,Ant),但支持得并不是很好。 1 依赖管理 Spring Boo...

Leech ⋅ 02/04 ⋅ 0

SpringBoot接口文档自动生成

由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业...

mkStone ⋅ 04/10 ⋅ 0

高性能 RESTful 框架 - EasyRest-NAS

EasyRest-NAS English doc EasyRest 与 Netty, Akka 和 Spring 的整合. 这是一个为快速开发而设计的高性能RESTful框架,极易搭建集群和使用分布式。你可以完全专注在你的业务逻辑上。 不需要...

Louie_L ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部