rest spring_Spring的REST服务发现性,第5部分

rest spring

这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第五篇。 上一篇文章介绍了RESTful服务HATEOAS的可发现性的概念,然后介绍了一些由测试驱动的实际方案。 本文将重点介绍可发现性的实际实现以及使用Spring 3.1在REST服务中满足HATEOAS约束的情况。

通过事件使可发现性脱钩

可发现性作为Web层的一个单独方面或关注点 ,应与处理HTTP请求的控制器分离。 为此,Controller将触发所有需要对HTTP响应进行其他操作的操作的事件:

@RequestMapping( value = "admin/foo/{id}",method = RequestMethod.GET )
@ResponseBody
public Foo get( @PathVariable( "id" ) Long id, HttpServletRequest request, HttpServletResponse response ){Foo resourceById = RestPreconditions.checkNotNull( this.service.getById( id ) );this.eventPublisher.publishEvent( new SingleResourceRetrieved( this, request, response ) );return resourceById;
}
@RequestMapping( value = "admin/foo",method = RequestMethod.POST )
@ResponseStatus( HttpStatus.CREATED )
public void create( @RequestBody Foo resource, HttpServletRequest request, HttpServletResponse response ){RestPreconditions.checkNotNullFromRequest( resource );Long idOfCreatedResource = this.service.create( resource );this.eventPublisher.publishEvent( new ResourceCreated( this, request, response, idOfCreatedResource ) );
}

然后,可以由任意数量的解耦侦听器来处理这些事件,每个侦听器都专注于其自身的特定情况,并且朝满足整体HATEOAS约束的方向发展。

同样,侦听器应该是调用堆栈中的最后一个对象,不需要直接访问它们; 因此,它们不是公开的。

使新创建资源的URI可被发现

如前一篇文章所述,创建新资源的操作应在响应的Location HTTP标头中返回该资源的URI。 :

@Component
class ResourceCreatedDiscoverabilityListener implements ApplicationListener< ResourceCreated >{@Overridepublic void onApplicationEvent( ResourceCreated resourceCreatedEvent ){Preconditions.checkNotNull( resourceCreatedEvent );HttpServletRequest request = resourceCreatedEvent.getRequest();HttpServletResponse response = resourceCreatedEvent.getResponse();long idOfNewResource = resourceCreatedEvent.getIdOfNewResource();this.addLinkHeaderOnResourceCreation( request, response, idOfNewResource );}void addLinkHeaderOnResourceCreation( HttpServletRequest request, HttpServletResponse response, long idOfNewResource ){String requestUrl = request.getRequestURL().toString();URI uri = new UriTemplate( "{requestUrl}/{idOfNewResource}" ).expand( requestUrl, idOfNewResource );response.setHeader( HttpHeaders.LOCATION, uri.toASCIIString() );}
}

不幸的是,即使在Spring 3.1中,处理低级别的请求和响应对象也是不可避免的,因为仍在努力提供用于指定Location的一流支持。

获取单一资源

检索单个资源应允许客户端发现URI以获取该特定类型的所有资源:

@Component
class SingleResourceRetrievedDiscoverabilityListener implements ApplicationListener< SingleResourceRetrieved >{@Overridepublic void onApplicationEvent( SingleResourceRetrieved resourceRetrievedEvent ){Preconditions.checkNotNull( resourceRetrievedEvent );HttpServletRequest request = resourceRetrievedEvent.getRequest();HttpServletResponse response = resourceRetrievedEvent.getResponse();this.addLinkHeaderOnSingleResourceRetrieval( request, response );}void addLinkHeaderOnSingleResourceRetrieval( HttpServletRequest request, HttpServletResponse response ){StringBuffer requestURL = request.getRequestURL();int positionOfLastSlash = requestURL.lastIndexOf( "/" );String uriForResourceCreation = requestURL.substring( 0, positionOfLastSlash );String linkHeaderValue = RESTURLUtil.createLinkHeader( uriForResourceCreation, "collection" );response.addHeader( LINK_HEADER, linkHeaderValue );}
}

请注意,链接关系的语义使用了“ 集合 ”关系类型,该类型以多种微格式指定和使用,但尚未标准化。

出于可发现性的目的, Link头是最常用的HTTP头之一。 因此,需要一些简单的实用程序来简化在服务器上创建其值并避免引入第三方库的情况。

从根本上发现

根是RESTful Web服务中的入口点–它是客户端首次使用API​​时与之联系的对象。 如果要始终考虑并实施HATEOAS约束,那么这是一个起点。 到目前为止,必须从根目录中发现系统的大多数主要URI,这一事实不足为奇。

这是从根本上提供可发现性的示例控制器方法:

@RequestMapping( value = "admin",method = RequestMethod.GET )
@ResponseStatus( value = HttpStatus.NO_CONTENT )
public void adminRoot( HttpServletRequest request, final response ){String rootUri = request.getRequestURL().toString();URI fooUri = new UriTemplate( "{rootUri}/{resource}" ).expand( rootUri, "foo" );String linkToFoo = RESTURIUtil.createLinkHeader( fooUri.toASCIIString(), REL_COLLECTION );response.addHeader( HttpConstants.LINK_HEADER, linkToFoo );
}

当然,这是该概念的说明,可以在该系列的概念证明RESTful服务的上下文中阅读。 在更复杂的系统中,会有更多的链接,每个链接都有自己的语义,这些语义由链接关系的类型定义。

可发现性与更改URI无关

与可发现性相关的最常见陷阱之一是一种误解,即由于URI现在是可发现的,因此它们可能会发生变化 。 但是,事实并非如此,这是有充分理由的:首先,这不是Web的工作方式–客户将URI加为书签,并希望它们将来能够正常工作。 其次,客户端不必浏览API就可以直接到达某个状态。

取而代之的是,RESTful Web服务的所有URI都应被视为即兴URI ,而URI 不变 。 相反,可以使用API​​的版本控制来解决URI重组的问题。

可发现性警告

正如前几篇文章中的某些讨论所指出的那样,可发现性的首要目标是最大限度地减少文档使用或不使用文档,并让客户通过获得的响应来学习和理解如何使用API​​。 实际上,这不应该被视为遥不可及的理想-这是我们如何使用每个新网页的方式- 没有任何文档 。 因此,如果该概念在REST上下文中存在更多问题,那么它必须是技术实施问题,而不是是否可能的问题。

话虽这么说,从技术上讲,我们离一个完整的解决方案还差得很远–规范和框架支持仍在不断发展,因此,可能必须做出一些折衷。 但是,这些都是妥协,应视为妥协。

结论

本文介绍了在具有Spring MVC的RESTful服务的上下文中实现可发现性的某些特征,并从根本上涉及了可发现性的概念。 在接下来的文章中,我将重点介绍自定义链接关系和Atom发布协议。 同时,检查github项目 。

参考:我们的JCG合作伙伴 Eugen Paraschiv在baeldung博客上的第5部分 Spring的REST服务发现性 。

相关文章 :

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

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

rest spring

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

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

相关文章

为啥这么多程序员大佬学习Cortex-M3

Cortex-M3是一个32位处理器内核。内部的数据路径是32位的&#xff0c;寄存器是32位的&#xff0c;存储器接口也是32位的。CM3采用了哈佛结构&#xff0c;拥有独立的指令总线和数据总线&#xff0c;可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线&#xff0c;…

Ffuf使用教程

kali安装教程链接&#xff1a;https://www.iculture.cc/cybersecurity/pig210 该工具用途广泛&#xff0c;可用于多种用途。一些用途&#xff1a; • 目录发现&#xff0c;可选择在 URL 中的任何位置进行模糊测试。 • 子域名发现 • 使用各种 HTTP 方法进行模糊测试。 安装 …

PHP中的__toString方法(实现JS里的链式操作)

_toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be converted to 示例: PHP里有很多的字符串函数,假如要先过滤字符首尾的空格,再求出字符串的长度,一般会这么写:strlen(trim($str));如果要实…

如何有效地使用反射

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

从字符串 const str = ‘qwbewrbbeqqbbbweebbbbqee‘;中能得到结果 [“b“, “bb“, “bbb“, “bbbb“] 以下错误语句是?

从字符串 const str qwbewrbbeqqbbbweebbbbqee;中能得到结果 ["b", "bb", "bbb", "bbbb"] 以下错误语句是&#xff1f;(B) A.str.match(/b/g) B.str.match(/b*/g) C.str.match(/b{1,4}/g) D.str.match(/b{1,5}/g) 解析&#xff1…

Burp Collaborator 使用总结

0x00&#xff1a;使用原因 我们在做渗透测试的时候&#xff0c;经常会遇到这种情况&#xff0c;测试跨站可能有些功能插入恶意脚本后无法立即触发&#xff0c;例如提交反馈表单&#xff0c;需要等管理员打开查看提交信息时才会触发&#xff0c;或者是盲注跨站&#xff0c;盲打 …

安装phpssdb扩展:

安装 igbinary 扩展(安装phpssdb扩展时候要用到--enable-ssdb-igbinary): clone https://github.com/igbinary/igbinary.git 安装phpssdb 扩展 &#xff1a;git clone https://github.com/jonnywang/phpssdb.git ; phpssdb 安装文档&#xff1a;https://github.com/jon…

在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )

在HTML中嵌入PHP代码&#xff0c;有以下几种方法&#xff0c;其中错误的是&#xff08; D&#xff09; A.以”<?php开头&#xff0c;以“?>”结束&#xff0c;中间为PHP代码。 B.以<script language“php”>开头&#xff0c;</script> 结束&#xff0c;中…

各大src地址

一、目录&#xff08;以下排名不分先后&#xff09; 1.360安全应急响应中心&#xff08;360SRC&#xff09;&#xff0d;http://security.360.cn/ 2.联想安全应急响应中心&#xff08;LSRC&#xff09;&#xff0d;http://lsrc.lenovo.com/ 3.腾讯安全应急响应中心&#xff…

文本”Hello, world.”显示的颜色是?

文本”Hello, world.”显示的颜色是? <style> #content .text {text-color:red;} #content>.title {color:green;} #content div.title {font-color:blue;} strong {font-color:yellow;} * {color:black;} </style> <div id"content"> <…

jrockit_1.6下载_Oracle JRockit Mission Control 4.1发布

jrockit_1.6下载Oracle发布了以前的仅JRockit专用工具Mission Control Suite&#xff08;JRMC&#xff09;的新版本。 4.1版本是次要版本升级&#xff0c;直接遵循4.0.1&#xff08;该版本发布于2010年中期&#xff09;。 但是&#xff0c;即使版本号表明是次要的升级&#xff…

dnslog盲注原理

Dnslog盲注原理 布尔盲注和时间盲注相当于猜单词的游戏&#xff0c;我们需要对每一位逐步的猜测&#xff0c;效率很低&#xff0c;需要发送很多的请求进行判断&#xff0c;很可能会触发安全设备的防护 我们需要一种方式能够减少请求&#xff0c;直接回显数据——Dnslog注入 Dn…

Sharepoint Ribbon Loaction

https://msdn.microsoft.com/zh-cn/library/ee537543%28voffice.14%29?f255&MSPPError-2147217396 列表视图相关loaction: Ribbon.List.CustomViews转载于:https://www.cnblogs.com/qiumc/p/4795020.html

JavaScript实现继承的方式,不正确的是:

JavaScript实现继承的方式&#xff0c;不正确的是&#xff1a;DA.原型链继承 B.构造函数继承 C.组合继承 D.关联继承 解析 javaScript实现继承共6种方式&#xff1a; 原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。

如何创建和销毁对象

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

msf各种弱口令爆破

msf各种弱口令爆破 Msf: 记录下msf各个爆破弱口令的模块 run post/windows/gather/arp_scanner RHOSTS10.10.10.0/24 使用arp_scanner模块 检测在线主机 metasploit 增加路由 route add 10.10.1.3 255.255.255.0 1使用扫描模块 use scanner/portscan/tcp爆破ssh Msf>us…

[学习笔记]批次需求计划系统-简要

一、该系统的目的二、系统特色(1)来源根据 如上图(2)仅仅补充需求来源的最大值&#xff0c;避免料件多买而造成浪费(3)可透过[发放LRP工单]将生产计划发放成正式工单(4)可透过[发放LRP採购单]将採购计划发放成正式的请购单或者採购单(5)系统会记录计划的来源单据&#xff0c;方…

在浏览器控制台执行以下代码,输入的结果是()

在浏览器控制台执行以下代码,输入的结果是(A) A.4400 4401 4399 4400 B.4400 4401 4401 4402 C.4400 4400 4399 4400 D.4400 4401 4399 4402 E.4400 4401 4401 4400 解析 js在执行之前

iOS-心跳

转载于:https://www.cnblogs.com/zhuyaguang/p/4800703.html

google国内镜像网址收集

搞IT的遇到问题&#xff0c;光靠baidu有时真的解决不了问题&#xff0c;所以时不时的就需要求助google&#x1f602;&#xff0c; 里面有好多国外网友的博客、stackoverflow、github issues、官方文档等等的大量一手英文资料&#xff0c; 但是因为种种原因国家一直不放开Google…