restful web_RESTful Web服务可发现性,第4部分

restful web

这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第四篇 。 本文将重点介绍REST API,HATEOAS的可发现性以及由测试驱动的实际方案。

引入REST可发现性

API的可发现性是一个值得引起足够关注的主题,因此很少有API能够正确地实现它。 如果做得正确,这也可以使API不仅具有RESTful和可用性,而且具有优雅的风格。

要了解可发现性 ,需要了解这种约束,即作为应用程序状态引擎(HATEOAS)的超媒体。 RESTful API的这种约束是关于作为应用程序状态唯一驱动程序的超媒体(实际上是超文本)对资源上的动作/转换的完全可发现性。 如果交互作用是由API通过对话本身(特别是通过超文本)来驱动的,那么就不可能有文档 ,因为这会迫使客户端做出实际上不在API上下文之外的假设。

此外,继续这种逻辑思路,确实可以认为RESTful API的唯一方法是,如果从根完全可以发现它并且没有先验知识 ,这意味着客户端应该能够通过在GET上执行GET来导航API。根。 展望未来,所有状态更改均由客户端使用REST API在表示形式中提供的可用且可发现的转换来驱动(因此称为Representational State Transfer )。

总之,服务器应具有足够的描述性,以指示客户端如何仅通过超文本来使用API​​,在HTTP对话的情况下,它可能是Link标头。

具体的可发现性场景(由测试驱动)


那么,REST服务可被发现意味着什么? 在本节中,我们将使用Junit, rest-assured和Hamcrest来测试可发现性的各个特征。 由于REST Service已在该系列的第3部分中得到保护,因此在使用API​​之前,每个测试都需要首先进行身份验证 。 还需要一些实用程序来解析响应的Link标头。

发现有效的HTTP方法
当使用无效的HTTP方法使用RESTful Web服务时,响应应为405 METHOD NOT ALLOWED ; 此外,它还应该使用响应中的“ 允许 HTTP标头”来帮助客户端发现该特定资源所允许的有效HTTP方法:

@Test
public void whenInvalidPOSTIsSentToValidURIOfResource_thenAllowHeaderListsTheAllowedActions(){// Givenfinal String uriOfExistingResource = this.restTemplate.createResource();// WhenResponse res = this.givenAuthenticated().post( uriOfExistingResource );// ThenString allowHeader = res.getHeader( HttpHeaders.ALLOW );assertThat( allowHeader, AnyOf.<String> anyOf( containsString("GET"), containsString("PUT"), containsString("DELETE") ) );
}

发现新创建的资源的URI
使用位置 HTTP标头,创建新资源的操作应始终在响应中包括新创建资源的URI。 如果客户端在该URI上执行GET,则该资源应可用:

@Test
public void whenResourceIsCreated_thenURIOfTheNewlyCreatedResourceIsDiscoverable(){// WhenFoo unpersistedResource = new Foo( randomAlphabetic( 6 ) );Response createResponse = this.givenAuthenticated().contentType( MIME_JSON ).body( unpersistedResource ).post( this.paths.getFooURL() );final String uriOfNewlyCreatedResource = createResp.getHeader( HttpHeaders.LOCATION );// ThenResponse response = this.givenAuthenticated().header( HttpHeaders.ACCEPT, MIME_JSON ).get( uriOfNewlyCreatedResource );Foo resourceFromServer = response.body().as( Foo.class );assertThat( unpersistedResource, equalTo( resourceFromServer ) );
}

该测试遵循一个简单的场景:创建一个新的Foo资源,并使用HTTP响应来发现该资源现在可访问的URI 。 然后,测试会更进一步,并对该URI进行GET检索以获取资源并将其与原始资源进行比较,以确保资源已正确保留。

发现URI以获取该类型的所有资源
当我们获取特定的Foo实例时,我们应该能够发现下一步可以做什么:我们可以列出所有可用的Foo资源。 因此,检索资源的操作应始终在其响应中包含URI,以在何处获取该类型的所有资源,再次使用Link标头:

@Test
public void whenResourceIsRetrieved_thenURIToGetAllResourcesIsDiscoverable(){// GivenString uriOfExistingResource = this.restTemplate.createResource();// WhenResponse getResponse = this.givenAuthenticated().get( uriOfExistingResource );// ThenString uriToAllResources = HTTPLinkHeaderUtils.extractURIByRel( getResponse.getHeader( "Link" ), "collection" );Response getAllResponse = this.givenAuthenticated().get( uriToAllResources );assertThat( getAllResponse.getStatusCode(), is( 200 ) );
}

该测试解决了REST中链接关系的一个棘手问题:要检索所有资源的URI使用rel =“ collection”语义。 这种类型的链接关系尚未标准化,但已被多种微格式使用 ,并已提出标准化要求。 非标准链接关系的使用开启了有关RESTful Web服务中的微格式和更丰富语义的讨论。

其他可能发现的URI和微格式

其他URI可能会通过Link标头发现,但是在没有转移到更丰富的语义标记(例如定义 自定义链接关系 , Atom发布协议或微格式)的情况下 ,现有的链接关系类型只有这么多。另一篇文章。

例如,如果在特定资源上执行GET时客户端可以发现URI来创建新资源,那将是一个很好的选择。 不幸的是,与模型创建语义没有链接关系。 幸运的是,标准做法是,用于创建的URI与用于获取该类型所有资源的URI相同,唯一的区别是POST HTTP方法。

结论

本文介绍了RESTful Web服务上下文中可发现性的一些特征,讨论了HTTP方法发现,创建与获取之间的关系,发现URI以获取所有资源的关系等。在接下来的文章中,我将重点介绍从root ,分页,自定义链接关系,Atom发布协议以及Spring REST服务中的Discoverability的实际实现开始发现API。 同时,检查github项目 。

参考: RESTful Web Service可发现性,我们的JCG合作伙伴 Eugen Paraschiv在baeldung博客上的第4部分 。

相关文章 :

  • 使用Spring 3.1和基于Java的配置引导Web应用程序,第1部分
  • 使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分
  • 使用Spring Security 3.1保护RESTful Web服务,第3部分
  • Spring的REST服务发现性,第5部分
  • 使用Spring Security 3.1的RESTful服务进行基本身份验证和摘要身份验证,第6部分
  • Spring&Quartz集成自定义注释
  • Spring MVC拦截器示例
  • 在运行时交换出Spring Bean配置

翻译自: https://www.javacodegeeks.com/2011/12/restful-web-service-discoverability.html

restful web

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序微信支付安卓手机可以,苹果手机支付失败。

问题截图: 解决办法有3种可能性,请按照对应的情况排查: 1.wx.request 无法发起网络请求,提示没有权限,域名已经配置过了,证书检测也是正确没问题的? 测试ios和安卓,假如有一方可以,一方不行,则是证书问题,请选用受认可的证书 检测地址:https://www.qcloud.co…

面试知识点总结01

1.Android 版本Bug 想必使用过 Android 5.0.1 系统的用户对内存泄露 bug 不会感到陌生&#xff0c;此缺陷不仅会导致内存占用过高&#xff0c;还会进而致使应用及其后台进程被强制关闭&#xff0c;甚至是系统界面崩溃等。 内存泄露 信息泄露 流量泄露 2.ArrayList 和LinkList的…

安装linux无驱动黑屏,ubuntu16.04安装黑屏与显卡安装笔记

本帖最后由 zhengchao666 于 2016-4-26 16:08 编辑ubuntu安装时黑屏处理问题描述&#xff1a;ubuntu使用光盘/USB安装时&#xff0c;出现"install ubuntu/ try ubuntu without installation"选择&#xff0c;但是Enter安装时&#xff0c;显示器显示没有信息&#xff…

从JS敏感信息泄露到GETSHELL

前言 小弟新手&#xff0c;大佬勿喷&#xff0c;文章有何不妥&#xff0c;还望大佬们斧正。 正文 前端时间打HW&#xff0c;拿到一个IP&#xff0c;先在FOFA上搜一下 发现这个IP现在开放了三个端口&#xff0c;分别是86&#xff0c;83&#xff0c;82对应不同的后台管理系统 …

HashMap两种遍历数据的方式

HashMap的遍历有两种方式&#xff0c;一种是entrySet的方式&#xff0c;另外一种是keySet的方式。 第一种利用entrySet的方式&#xff1a; Map map new HashMap(); Iterator iter map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry (Map.Entry) iter.ne…

jOOQ类型安全数据库查询教程

课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自从JDBC以来&#xff0c;几乎没有采取任何相关的措施来更好地将SQL集成到Java中。 在更高级别上…

中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程

计算机原理、计算机应用基础、计算机网络基础、CAD辅助设计、三维动画设计、VBSIC语言及程序设计PHOTOSHOP、Windows、网页设计、Office办公自动化、多媒体、计算机系统安装及维护管理、计算机病毒原理防范等。计算机专业就业前景计算机专业就业前景很好。随着现代经济和科技的…

教你玩转CSS表格(table)

目录 表格边框 折叠边框 表格宽度和高度 表格文字对齐 表格填充 表格颜色 表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框: table, th, td {border: 1px solid black;}

实战|全程分析js到getshell

本篇转载于https://forum.butian.net/share/260 看到望海师傅的山理证书真滴好看&#xff0c;真想搞一本&#xff0c;刚刚入edusrc的时候收集了一波山理的子域资产&#xff0c;全部看了一遍都被大佬挖的干干净净了。没有内网VPN基本上挖不到&#xff0c;然后我就去公众号看了一…

教你吃透CSS的盒子模型(Box Model)

目录 CSS 盒子模型(Box Model) 元素的宽度和高度 浏览器的兼容性问题 CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,”box model”这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容…

多家防火墙设备存在信息泄露漏洞

概述 漏洞名称多家防火墙设备存在信息泄露漏洞安全通告发布日期2021-06-16受影响产品及版本胜鑫塔下一代防火墙XT6000-A-FW-1.0.0-0-2778 利谱第二代防火墙6164-1.5.2 任子行下一代防火墙SURF-NGSA-V-3000 中科网威下一代防火墙F6600L-1.5.2 任子行网络安全审计系统内置报表 网…

c语言 linker error,[Linker error] undefined reference to `prinf'的问题!

[Linker error] undefined reference to prinf的问题&#xff01;环境为dev-cpp日志如下&#xff1a;编译器: Default compiler执行 gcc.exe...gcc.exe "E:\C\ran.c" -o "E:\C\ran.exe" -I"D:\Dev-Cpp\include" -L"D:\Dev-Cpp\lib"C:\…

独处可以激发思考的力量

如果你知道怎么独处的话&#xff0c;成大事者都是善于独处的人&#xff0d;&#xff0d;在独处的过程中激发思考的力量。 自卑可以像一座大山把人压倒并让你永远沉默&#xff0c;也可以像推进器产生强大的动力。 比别人先走一步&#xff0c;能创造一种成功的心境。 在独处时&am…

教你玩转CSS border(边框)

目录 边框样式 border-style 值 边框宽度 边框颜色 边框-单独设置各边 实例 边框-简写属性 CSS 边框属性

从命令式功能到纯功能性,然后再返回:Monads与范围内的延续

这则影片随附此文章&#xff0c;没有它不会有太大意义 上个月&#xff0c;我在Curry On会议上做了演讲&#xff0c;该会议是与学术&#xff0c;编程语言会议ECOOP共同举办的新会议。 Curry On旨在弥合学术界之间的鸿沟。 我的学术兴趣不包括编程语言&#xff0c;我认为编程语言…

php boolean 全大写还是全小写,【PHP培训】PHP为什么大小写规则是如此不规则?

据 但还是建议使用统统敏感的写法&#xff0c;推荐大家始终坚持“大小写敏感”&#xff0c;遵循统一的代码规范&#xff0c;不定义大小相同的函数和方法。 一、大小写敏感 1.变量名区分大小写 所有变量均区分大小写&#xff0c;包括普通变量以及$_GET,$_POST,$_REQUEST,$_C…

c语言调用话筒的程序,c – OpenAL:如何创建简单的“麦克风回声”程序?

一个古老的问题,但这是一个答案.如果我们真的想要简洁,它肯定可以修剪,但这有点不到100条有效线&#xff1a;#include // OpenAL header files#include #include using std::list;#define FREQ 22050 // Sample rate#define CAP_SIZE 2048 // How much to capture at a time (a…

轶事奇语

---恢复内容开始--- Windows自带的记事本编辑文本时&#xff0c;如果使用utf-8编码的文件&#xff0c;会在每个文件开头添加一个值为0xefbbbf字符&#xff0c;会导致许多奇怪的问题&#xff0c;如网页第一行可能会显示一个"?", 或编译器报语法错误&#xff0c;等。U…

教你玩转CSS 轮廓(outline)属性

目录 CSS 轮廓&#xff08;outline&#xff09; 所有CSS 轮廓&#xff08;outline&#xff09;属性 CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用…

单片机c语言参考文献最新,[2018年最新整理]10个单片机C语言实例.doc

[2018年最新整理]10个单片机C语言实例经典单片机实验帮你成功1&#xff0e; 闪烁灯1&#xff0e; 实验任务如图4.1.1 所示&#xff1a;在P1.0 端口上接一个发光二极管L1&#xff0c;使L1 在不停地一亮一灭&#xff0c;一亮一灭的时间间隔为0.2 秒。2&#xff0e; 电路原理图图4…