这是有关使用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服务可发现性,我们的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服务可发现性,第4部分相关推荐

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

    restful web 这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第四篇 . 本文将重点 ...

  2. restful api_将Spring MVC RESTful Web服务迁移到Spring 4

    restful api 1引言 Spring 4为MVC应用程序带来了一些改进. 在这篇文章中,我将重点介绍宁静的Web服务,并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试 ...

  3. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

    http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/ 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务 Y ...

  4. 将Spring MVC RESTful Web服务迁移到Spring 4

    1引言 Spring 4为MVC应用程序带来了一些改进 . 在这篇文章中,我将重点介绍宁静的Web服务,并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试这些改进.以下几点总结 ...

  5. 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

    Spring,构建 Java™ 平台和 Enterprise Edition (Java EE) 应用程序的著名框架,现在在其模型-视图-控制器(Model-View-Controller ,MVC) ...

  6. jersey tomcat MySQL_基于jersey和Apache Tomcat构建Restful Web服务(一)

    基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  7. 如何使用 Tibco Business Works 6 (BW6) 或容器版 (BWCE) 创建 Restful Web 服务

    TIBCO Active Matrix Business Works 是一种中间件产品,可作为关键任务 IT 环境的集成基础.Business Works 6由包括基于 Eclipse 的设计时.强大 ...

  8. 构建 RESTful Web 服务

    from: https://www.ibm.com/developerworks/cn/education/java/j-rest/j-rest.html 开始之前 关于本教程 REST 是一种思维方 ...

  9. RESTful Web 服务 - Java (JAX-RS)

    JAX-RS 表示用于 RESTful Web 服务的 Java API.JAX-RS 是一种基于 Java 的编程语言 API 以及为创建 RESTful Web 服务提供支持的规范.2.0 版本发 ...

最新文章

  1. 我所理解的OOP——UML六种关系
  2. 三国大将风云java_三国正史四大猛将:临阵斩杀敌方大将,连吕布和马超也做不到...
  3. Effective Java之优先使用标准的异常(六十)
  4. c#学习总结(一)---Mr.Zhang
  5. RabbitMQ和Kafka的显著差异(over)
  6. 用计算机里可以加50度电,一台电脑一天用多少度电 节电节能的建议和措施
  7. 《计算机操作系统(慕课版)》(汤小丹著)课后习题答案
  8. 高中计算机基础知识课件,高中信息技术基础教案
  9. 计算机软件工程专业选科要求,选考科目科普:软件工程专业要求哪些选考科目?...
  10. linux幻灯片制作软件,Marp(代码制作幻灯片软件)
  11. 【计算机组成原理】程序,指令,机器指令,微程序,微指令,微命令,微操作的关系
  12. 蚂蚁区块链-CONFIDE-ACM SIGMOD 20
  13. 远程 PC 访问软件
  14. 【Linux】【Kernel】BUG: scheduling while atomic问题分析
  15. fastdfs上传文件的简易方法
  16. 获取加速传感器的值 APK
  17. 2016NOIP信息学竞赛普及组(北京)一等奖名单
  18. 巨坑 jom makefile debug error 2 报错
  19. 基于 PaddleClas 的 SoccerNet 足球 ReID 基线
  20. 干货:大学考试不挂科的小窍门

热门文章

  1. lambda表达式优化反射_反射选择器表达式
  2. javafx_JavaFX在这里留下来!
  3. 49自动化测试中最常见的硒异常
  4. 依赖管理和Maven
  5. 使用Java 8 Lambda表达式将实体映射到DTO
  6. 功能Java示例 第8部分–更多纯函数
  7. jersey spring_实施Jersey 2 Spring集成
  8. 使用Spring开发Java RESTful Web服务的7个理由
  9. spring 长轮询_Spring集成文件轮询和测试
  10. jvm 方法内联_方法内联在JVM中有多积极?