Spring REST实践之HATEOAS

Spring Boot+HATEOAS快速介绍与示例 HATEOAS , 全称是Hypermedia as the engine of application state , 翻译一下是:超媒体作为应用程序状态引擎, 也翻译成超媒体即应用状态引擎。 Spring Boot提供了对HATEOAS 的支持, 通过导入启动器spring-boot-starter-hateoas加载需要的依赖。 使用Spring hateoas 的API 可以快速的返回HATEOAS 格式的响应。 阅读详情

HATEOAS

HATEOAS(The Hypermedia As The Engine Of Application Statue)是REST架构的主要约束。“hepermedia”表示任何包含指向图片、电影、文字等资源的链接,Web是超媒体的经典例子。HATEOAS背后的思想其实非常简单,就是响应中包含指向其它资源的链接。客户端可以利用这些链接和服务器交互。

client不用事先知道服务或者工作流中不同步骤,还有client不用再为不同的资源硬编码URI了。而且服务器还可以在不破坏和客户端交互的情况下,更改URI。

非HATEOAS的响应例子是:

GET /posts/1 HTTP/1.1
Connection: keep-alive
Host: blog.example.com
{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z"
}

而HATEOAS的响应例子则是:

{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z",
    "links" : [
        {
            "rel" : "self",
            "href" : http://blog.example.com/posts/1,
            "method" : "GET"
        }
    ] 
}

上面的例子中,每一个在links中的link都包含了三部分:

href:用户可以用来检索资源或者改变应用状态的URI
rel:描述href指向的资源和现有资源的关系
method:和此URI需要的http方法

在rel中“self”表示了自描述的关系。如果一个资源包含其它资源,那么可以按照下面例子组织:

{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z",
    "self" : "http://blog.example.com/posts/1",
    "author" : "http://blog.example.com/profile/12345",
    "comments" : "http://blog.example.com/posts/1/comments",
    "tags" : "http://blog.example.com/posts/1/tags"
}

上面的例子和前一个例子有些不同,没有使用links数组。

JSON Hypermedia Types

JSON媒体类型没有提供原生的超链接语法,所以为了解决这个问题,有几种JSON超媒体类型被创建出来:

• HAL—http://stateless.co/hal_specification.html
• JSON-LD—http://json-ld.org
• Collection+JSON—http://amundsen.com/media-types/collection/
• JSON API—http://jsonapi.org/
• Siren—https://github.com/kevinswiber/siren

HAL是其中最流行的一种,而且被Spring Framework支持。

HAL

HAL(The Hypertext Application Language)是简单的超媒体类型,由Mike Kelly于2011创建。它同时支持XML和JSON格式。HAL媒体类型定义了一种资源,它是状态的容器、links的集合、嵌套资源的集合。如下图所示:

HAL resource structure

资源状态是用JSON的key/valude形式表达的。如下面所示:

{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z"
}

HAL规范中定义,使用_links包含所有的link。如下面例子所示:

{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z",
    "_links" : {
        "self": { "href": "http://blog.example.com/posts/1" },
        "comments": { "href": "http://blog.example.com/posts/1/comments",
                      "totalcount" : 20 },
        "tags": { "href": "http://blog.example.com/posts/1/tags" }
    } 
}

在HAL嵌套资源的情况,如下面例子所示:

{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z",
    "_links" : {
         "self": { "href": "http://blog.example.com/posts/1" },
         "comments": { "href": "http://blog.example.com/posts/1/comments",
         "totalcount" : 20 },
         "tags": { "href": "http://blog.example.com/posts/1/tags" }
    },
    "_embedded" : {
        "author" : {
            "_links" : {
                "self": { "href": "http://blog.example.com/profile/12345" }
            },
            "id" : 12345,
            "name" : "John Doe",
            "displayName" : "JDoe"
        }
    } 
}

HATEOAS in Spring

<dependency>
    <groupId>org.springframework.hateoas</groupId>
    <artifactId>spring-hateoas</artifactId>
    <version>0.17.0.RELEASE</version>
</dependency>

为了简化超链接的嵌入,Spring HATEOAS提供了org. springframework.hateoas.ResourceSupport,一般应由资源类进行扩展。ResourceSupport类为增加/删除链接提供了重载方法,它也包含了getId方法,此方法返回和资源相关的URI。getId的实现依据了REST的一个准则:一个资源的ID就是它的URI。

下面的例子是在Spring中使用HATEOAS的代码:

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@RestController
public class PollController {
    @RequestMapping(value="/polls", method=RequestMethod.GET)
    public ResponseEntity<Iterable<Poll>> getAllPolls() {
        Iterable<Poll> allPolls = pollRepository.findAll();
        for(Poll p : allPolls) {
            updatePollResourceWithLinks(p);
            return new ResponseEntity<>(allPolls, HttpStatus.OK);
        }
    }

    @RequestMapping(value="/polls/{pollId}", method=RequestMethod.GET)
    public ResponseEntity<?> getPoll(@PathVariable Long pollId) {
        Poll p = pollRepository.findOne(pollId);
        updatePollResourceWithLinks(p);
        return new ResponseEntity<> (p, HttpStatus.OK);
    }
        
    private void updatePollResourceWithLinks(Poll poll) {
        poll.add(linkTo(methodOn(PollController.class).getAllPolls()).slash(poll.getPollId()).withSelfRel());
        poll.add(linkTo(methodOn(VoteController.class).getAllVotes(poll.getPollId())).withRel("votes"));
        poll.add(linkTo(methodOn(ComputeResultController.class).computeResult(poll.getPollId())).withRel("compute-result"));
    } 
} 

下图是上面例子的响应:

response with links

SpringBoot RESTful API设计最佳实践:符合HATEOAS原则的API设计 本文介绍了RESTful API与HATEOAS的核心概念及其在Spring Boot中的实现。主要内容包括: REST架构风格:详细解析了REST的六个核心约束,重点强调了HATEOAS原则作为统一接口的关键子原则,以及它与传统REST API的对比优势。 HATEOAS原理:阐述了超媒体作为应用状态引擎的核心思想,通过服务器提供的动态链接驱动客户端状态转换,实现松耦合、高可发现性的API设计。 Spring HATEOAS实现: 介绍了Spring HATEOAS模块的核心组件(Resource、Lin 阅读详情

相关推荐

Unity 升级 xLua 版本,编译不同平台链接库

Unity 升级 xLua 详解

LymanCao的专栏 1800

HATEOAS

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

qq_59066017的博客 484

torch.jit.script 与 torch.jit.trace

它们是 PyTorch 的即时编译(Just-in-Time Compilation)模块的一部分,用于提高模型的执行效率并支持模型的部署。方法只跟踪了给定输入张量的执行路径,因此在使用转换后的模块对象进行推理时,输入张量的维度和数据类型必须与跟踪时使用的相同。跟踪模型可以看作是一个具有相同功能的脚本模型,但它还保留了原始模型的动态特性,可以使用更多高级特性,如动态图和控制流。它接受一个模型和一个示例输入,并记录模型在给定输入上的执行过程,然后返回一个跟踪模型。的模型文件,并将其转换为评估模式。

leoatliang的博客 1万+

spring hateoas

restful 风格 HATEOAS是Hypertext As The Engine Of Application State的缩写 REST的最高级形态 先介绍一下 Richardson 提出的 REST 成熟度模型。 该模型把 REST 服务按照成熟度划分成 4 个层次: 第一个层次(Level 0)的 Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种...

qq120631157的博客 1353

H桥电路原理

一、H桥原理 图1中所示为一个典型的直流电机控制电路。电路得名于“H桥式驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图1及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。   如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左...

Loadingzc的专栏 7万+

3D Slicer + MONAI Bundle实战:如何用Wholebrainseg模型快速分割133个脑区(附避坑指南)

本文详细介绍了如何利用MONAI Model Zoo中的Wholebrainseg模型,在3D Slicer环境中高效分割133个脑区。文章重点提供了数据预处理、GPU推理加速及结果精修等实战技巧与避坑指南,旨在帮助医学影像研究者和开发者提升全脑分割的精度与效率。

308

初识Spring HATEOAS

REST 这个词想必大家都并不陌生。REST 架构REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换。REST 是一种架构风格,它包含了一个分布式超文本系统中对于组件、连接器和数据的约束。其关键在于所定义的架构上的各种约束。只有满足这些约束,才能称之为符合 REST 架构风格。REST 的约束包括:  客户端-服务器结构。通过一个统...

I_forever的专栏 2686

华为eNSP镜像包全集下载,包含CE6800、CE12800、NE系列等!

你好,这里是网络技术联盟站。昨天给大家介绍了win11、10下安装eNSP最新系列(1.3.00)并完美运行,附下载。从文章发布到发文前,一直有朋友想让瑞哥提供一下华为ENSP镜像包,今天安排!eNSP安装包、以及eNSP中所需要的镜像包(设备包)(CE、CX、NE40E、NE5000E、NE9000、USG)例如:导入一个USG设备包,eNSP中的USG5500和USG6000V都是可以启动的。如果你的报错“40”的话,那么打开Oracle VM VirtualBox这个虚拟机,删除对应报错的虚拟机,然后

网络技术联盟站 3万+

(九)Spring Rest

Spring REST 使得构建 RESTful Web 服务变得简单而直观。通过使用 Spring 提供的注解和功能,开发人员可以快速创建强大的 REST API,同时享受 Spring 的强大支持。通过遵循 RESTful 设计原则、合理使用 HTTP 方法、路径和状态码,开发人员能够构建出简洁、可维护的 API。

qq_50847694的博客 957

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device, Quartus的安装过程不同于ISE/vivado的安装。“Current license file does not support”这种情况多出现在高版本的quartus中综合很久以前的代码,使用很早型号的FPGA或是CPLD。对于这种情况,就得在官网或是其他网站上下载包含所需Device的库文件。

夜半少年的博客 1万+

华为OD机试真题新系统-空间占用计算(Py/Java/C/C++/Js/Go)

华为OD机试新系统机试真题 【空间占用计算】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【空间占用计算】。

qq_45776114的博客 3430

探究 Spring 的 REST 支持与 HATEOAS

Spring 对 REST 的支持和 HATEOAS 的引入,为开发者提供了一套完整的工具和理念,用于构建高效、可扩展且符合 RESTful 规范的 Web 服务。通过@RestController、请求参数绑定注解等功能,开发者可以快速实现 REST API;结合 HATEOAS 原则,能够使 API 具备更强的自描述性和灵活性。在实际开发中,合理运用这些技术,能够提升系统的架构质量和用户体验,尤其适用于需要频繁迭代和扩展的现代 Web 应用。

潜意识Java的博客 1395

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1143

Spring Boot学习3:web篇(中)-Spring boot Rest学习

--REST理论基础1.架构属性性能可伸缩性统一结构简化性:如URI,RequestHeader,RequestBody等等组件可修改性:组件通讯可见性组件可移植性可靠性2.架构约束C/S架构无状态可缓存:两个方面,服务端和客户端分层系统按需代码统一接口3.统一几口(Uniform Interface)资源识别:URI资源操作:GET(取资源),POST(非幂等性,实现的时候需要实现幂等性),PU...

一枚程序员的博客 715

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring Boot REST API开发全攻略:从入门到精通

本文全面介绍了Spring Boot REST API开发的最佳实践,涵盖了RESTful API设计原则、HTTP方法正确使用、状态码规范、版本管理策略、分页过滤实现、HATEOAS超媒体支持、安全最佳实践、性能优化、文档测试等方面,并深入探讨了Spring Data JPA集成优化和API版本控制与文档生成技术。 ## RESTful API设计最佳实践 在现代Web应用开发中,REST...

gitblog_00719的博客 705

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringOne2GX 2013 是 Pivotal(现为 VMware Tanzu)主办的年度 Spring 技术大会

SpringOne2GX 2013 是 Pivotal(现为 VMware Tanzu)主办的年度 Spring 技术大会,2013 年的会议中,Oliver Gierke 和 Greg Turnquist 演示了 **Spring RESTBucks** —— 一个基于 Spring Framework 构建的、严格遵循 REST 原则(尤其是 HATEOAS)的超媒体驱动(hypermedia-driven)RESTful Web 服务示例项目。

[Blog][Domain] programb.blog.youkuaiyun.com 421

spring

Building REST services with Spring REST has quickly become the de-facto standard for building web services on the web because they’re easy to build and easy to consume. There’s a much la

bestlove12345的博客 1792

【大厂面试实录】房产金融系统REST API与监控运维深度解析:小润龙的技术进阶之路

通过互联网大厂Java面试场景,深入探讨房产金融系统中REST API设计与监控运维实践。涵盖Spring HATEOAS、Swagger/OpenAPI、Prometheus监控等核心技术栈,包含真实面试对话和详细技术解析,适合Java开发工程师技术提升。

2303_76177839的博客 751

Rest软件架构

用于设计分布式系统中的网络应用程序。它不是标准或规范,而是一组约束条件和设计原则。:Spring Cloud Gateway 或 AOP。:资源的具体表现形式(JSON、XML、HTML):POST 创建成功(返回 Location):DELETE、PUT 成功(无返回体):一切皆为资源(用户、订单、文章等):通过 HTTP 动词改变资源状态。:多次执行同一操作,结果相同。:GET、PATCH 成功。:使用 JWT(无状态):不修改服务器资源。:从 V1 开始设计。

weixin_44984196的博客 720

使用REST访问MongoDB数据是一种常见的方式,它允许客户端通过HTTP请求与数据库进行交互

实际上,**MongoDB 本身并不直接提供 REST API**。它是一个基于 BSON/JSON 的 NoSQL 数据库,原生使用 **MongoDB Wire Protocol(二进制协议)**,通过官方驱动(如 Node.js 的 `mongodb`、Python 的 `pymongo`)或 Shell(`mongosh`)进行访问。

[Blog][Domain] programb.blog.youkuaiyun.com 502

微服务架构10条最佳实践

转载自公众号:SpringForAll社区确保你在分布式系统中,努力实现这些微服务的最佳实践,例如监控和REST成熟度。使用微服务架构可以解决所有的软件架构的问题,对吗?...

程序猿DD 1129

Spring Boot 开挂:3 行代码 = 8 个接口

本文介绍了如何利用SpringBoot与SpringDataREST快速构建RESTful接口。通过定义实体类和Repository接口,仅需3行核心代码即可自动生成8个以上功能完备的CRUD接口,支持分页、排序和HATEOAS特性。文章详细解析了SpringDataREST的工作原理,包括自动端点映射、关联关系处理和HATEOAS支持,并提供了定制化配置、安全集成、事件监听等高级用法。这种开发模式显著提升了后端开发效率,特别适合快速原型开发和简单CRUD服务,同时也探讨了性能优化、监控和生产环境部署的注意

油墨香^-^的博客 232
上一篇: 浏览器缓存详解:expires,cache-control,last-modified,etag详解
下一篇: java spring中常用工具类介绍
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值