1、什么是RestFul

经常上网的同学会发现,现代软件的一个重要趋势就是互联网化,几乎没有一款软件是纯粹的单机版了。通常的情况下,软件管理着服务器的资源以及这些资源的状态变化,用户通过在浏览器输入http地址,能够对服务器的资源进行各种处理。这就要求软件提供一组访问接口,使得软件能够和互联网的http访问格式完美对接。REST对这种借口的一种约束标准。(这里我们所说的软件,最常见的形式就是一个网站系统)

REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换,REST 这个词是2000 年 Roy Fielding 在其博士论文中创造出来的。REST 是一种架构风格,它包含了一个分布式超文本系统中对于组件、连接器和数据的约束。REST 是作为互联网自身架构的抽象而出现的,其关键在于所定义的架构上的各种约束。只有满足这些约束,才能称之为符合 REST 架构风格,即所谓的“RESTful”服务。

这里我们不对这些约束进行描述。详细内容可以参考IBM的一篇文章(http://www.ibm.com/developerworks/cn/java/j-lo-SpringHATEOAS/)

2、HATEOAS

HATEOAS(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。它的重要性在于打破了客户端和服务器之间严格的契约,使得客户端可以更加智能和自适应,而 REST 服务本身的演化和更新也变得更加容易。

上面这段话其实很难理解。首先hateoas这个单词就很难记住,我的方法是先记住hate(恨之入骨),然后再加上oas。经过一点实践,我认为这里的自适应,指得是服务器返回给客户端的信息中,会自动包含了客户端能够进行的操作,这样二者之间就不用通过建立一份额外的文档来约定访问的格式了。

3、Spring HATEOAS

Spring Hateoas,是Spring的一个子项目,Spring HATEOAS 的主要功能在于提供了简单的机制来创建这些满足HATEOAS要求的链接,并与 Spring MVC 框架有很好的结合。在实践中,我不会单独使用这个子项目,而是采用下面的方法。

4、Spring Data REST

Spring Data Rest也是Spring的一个子项目,它的主要功能就是把你的Spring Data Repositories以满足HATEOAS的格式暴露出去,因此你的JPA资源Repository可以用一种通用的http访问格式对你的Respository进行CRUD,而且可以省去大部分controller和services的逻辑,因为Spring Data REST已经为你都做好了,你只需要保证你的http访问格式正确即可,是不是很酷?(关于JPA,也是一个比较常见的概念,我会在另外一篇博客里面讲一下我的理解)

还有更酷的一点,我们可以对Repositories对外暴露的格式和内容进行个性化的定制,这属于稍微高级一点的内容,我们这里不涉及。

现在我们就可以看看默认的Spring Data Test对访问格式是如何定义的,当然,最权威的还是官方的文档,地址在这里(http://docs.spring.io/spring-data/rest/docs/2.4.0.RELEASE/reference/html/)

下面是我用Spring Data Rest提供的工具The HAL Browser得到一些结果(关于该工具的使用,请参考http://docs.spring.io/spring-data/rest/docs/2.4.0.RELEASE/reference/html/#_the_hal_browser)。

再补充一下:我对默认的配置做了一点改动,这样我们在返回的json格式的结构体中会包含id。

public class AppConfig extends RepositoryRestMvcConfiguration {
@Override
public RepositoryRestConfiguration config() {
RepositoryRestConfiguration config = super.config();
config.setDefaultPageSize(6);/*设置默认页大小*/
//设置返回的json Body中显示id
config.exposeIdsFor(User.class);
     //config.setReturnBodyOnCreate(true);设置创建成果后返回创建成果的结果,实际上这样做没有什么意义
return config;
}
}

4.1获取集合资源

General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/traveller/users?page=0
Request Method:GET
Status Code: OK Response Headers
Content-Type:application/json;charset=UTF-8
Date:Wed, 30 Sep 2015 17:27:07 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked //下面是返回的JSON格式体
{
  "_links": {
"self": {
"href": "http://localhost:8080/traveller/users{?page,size,sort}",
"templated": true
},
"next": {
"href": "http://localhost:8080/traveller/users?page=1&size=6{&sort}",
"templated": true
},
"search": {
"href": "http://localhost:8080/traveller/users/search"
}
},
"_embedded": {
"users": [
{
"id": 1,
"birthdate": "2015-09-16",
"country": 0,
"email": "stive.jobs@apple.com",
"enabled": true,
"info": null,
"name": "JOBS",
"password": "steve",
"phone": "0033 1 23 45 67 89",
"picture": "1.jpg",
"gender": 0,
"regdate": "2015-09-25T02:54:01.000+0000",
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/1"
}
}
},
{
"id": 2,
"birthdate": null,
"country": 0,
"email": "bill.gates@microsoft.com",
"enabled": true,
"info": null,
"name": "GATES",
"password": "bill",
"phone": "0033 1 23 45 67 89",
"picture": "2.jpg",
"gender": 0,
"regdate": null,
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/2"
}
}
},
{
"id": 3,
"birthdate": null,
"country": 0,
"email": "mark.zuckerberg@facebook.com",
"enabled": true,
"info": null,
"name": "ZUCKERBERG",
"password": "zuckerberg",
"phone": "0033 1 23 45 67 89",
"picture": "3.jpg",
"gender": 0,
"regdate": null,
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/3"
}
}
},
{
"id": 4,
"birthdate": null,
"country": 0,
"email": "tim.cook@apple.com",
"enabled": true,
"info": null,
"name": "COOK",
"password": "cook",
"phone": "0033 1 23 45 67 89",
"picture": "4.jpg",
"gender": 0,
"regdate": null,
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/4"
}
}
},
{
"id": 5,
"birthdate": null,
"country": 0,
"email": "larry.page@gmail.com",
"enabled": true,
"info": null,
"name": "Page",
"password": "page",
"phone": "0033 1 23 45 67 89",
"picture": "5.jpg",
"gender": 0,
"regdate": null,
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/5"
}
}
},
{
"id": 6,
"birthdate": null,
"country": 0,
"email": "sergey.brin@gmail.com",
"enabled": true,
"info": null,
"name": "Brin",
"password": "brin",
"phone": "0033 1 23 45 67 89",
"picture": "6.jpg",
"gender": 0,
"regdate": null,
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/6"
}
}
}
]
},
"page": {
"size": 6,
"totalElements": 25,
"totalPages": 5,
"number": 0
}
}

4.2获取单个资源

General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/traveller/users/1
Request Method:GET
Status Code:200 OK Response Headers
Content-Type:application/json;charset=UTF-8
Date:Wed, 30 Sep 2015 17:35:23 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
{
"id": 1,
"birthdate": "2015-09-16",
"country": 0,
"email": "stive.jobs@apple.com",
"enabled": true,
"info": null,
"name": "JOBS",
"password": "steve",
"phone": "0033 1 23 45 67 89",
"picture": "1.jpg",
"gender": 0,
"regdate": "2015-09-25T02:54:01.000+0000",
"_links": {
"self": {
"href": "http://localhost:8080/traveller/users/1"
}
}
}

4.2保存单个资源

General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/traveller/users
Request Method:POST
Status Code:201 Created Response Headers
Content-Length:0
Date:Wed, 30 Sep 2015 17:40:00 GMT
Location:http://localhost:8080/traveller/users/30
Server:Apache-Coyote/1.1 无其他返回值

RestFul && HATEOAS && Spring-Data-Rest介绍的更多相关文章

  1. springboot:spring data jpa介绍

    转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...

  2. spring boot(五)Spring data jpa介绍

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  3. Spring Data JPA介绍与简单案例

    一.Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Languag ...

  4. Spring Data JPA 介绍

    Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在 ...

  5. spring data jpa介绍

    首先了解JPA是什么? JPA(JavaPersistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主 ...

  6. 初探 spring data(一)--- spring data 概述

    由于自己一个项目要用多到Sql与NoSql两种截然不同的数据结构,但在编程上我希望统一接口API,让不同类型的数据库能在相同的编程接口模式下运作.于是找了一个spring的官网,发现一个spring ...

  7. 通过Spring Data Neo4J操作您的图形数据库

    在前面的一篇文章<图形数据库Neo4J简介>中,我们已经对其内部所使用的各种机制进行了简单地介绍.而在我们尝试对Neo4J进行大版本升级时,我发现网络上并没有任何成型的样例代码以及简介,而 ...

  8. Springboot 系列(十)使用 Spring data jpa 访问数据库

    前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...

  9. 【ORM框架】Spring Data JPA(一)-- 入门

    本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

  10. 展开被 SpringBoot 玩的日子 《 五 》 spring data jpa 的使用

    在上篇文章< 展开被 SpringBoot 玩的日子 < 二 >WEB >中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring da ...

随机推荐

  1. springMVC2 1入门程序

    1入门程序 .1需求 实现商品列表查询 .2需要的jar包 使用spring3.2.0(带springwebmvc模块) .1前端控制器 在web.xml中配置: <?xml version=& ...

  2. Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 类

    Ruby和其他面向对象的语言一样,使用类来组织方法,然后实例化类,创建对象.1.构造方法使用双引号是字符串的字面构造方法,也可以使用“具名构造方法”,即在类名上调用new方法 >> s=& ...

  3. SIGGRAPH 2014 之行

    当地时间8月8号: 经历十个多小时的飞行,在紧急出口旁的位置上忍受发动机的轰鸣声后,顺利降落温哥华机场.回答完加拿大边检的几个诸如为何而来,打算住哪儿的问题后,比较顺利出关.三十五加元的打车费及百分十 ...

  4. Asp.Net 之 WebService部署到服务器后出现" The test form is only available for requests from the local machine "

    最近由于任务需要开发了一个WebService, 部署到服务器以后,出现上述问题,网上查找到如下解决方案: 问题原因: 从 NET Framework 1.1 起定义了一个名为 HttpPostLoc ...

  5. Android(java)学习笔记80:UDP协议发送数据

    UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; import java.io.IOException; import java.net. ...

  6. NSURLConnection、NSURLSession

    NSURLConnection   1.准备网络资源地址:URL 注意:由于URL支持26个英文字母,数字和少数的几个特殊字符. 因此对于URL中包含非标准URL的字符,需要进行编码. iOS提供了函 ...

  7. Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片

    Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在edge ...

  8. Jedis操作Redis数据库

    添加Maven依赖: <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</grou ...

  9. hdu 1423 最长公共递增子序列

    这题一开始把我给坑了,我还没知道LCIS的算法,然后就慢慢搞吧,幸运的是还真写出来了,只不过麻烦了一点. 我是将该题转换为多条线段相交,然后找出最多多少条不相交,并且其数值死递增的. 代码如下: #i ...

  10. 《跨终端Web》读书笔记

    跨终端的Web成为了趋势,而这本书就是讲了在这种趋势下进行开发的常见问题及其解决方案,可能是限于篇幅,每个方面都没有展开细说,但这是这样让本书干货满满,几乎没有一句废话. 下面是一些笔记. Web的本 ...