- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
什么是 HATEOAS ?超媒体作为应用程序状态引擎是 REST 应用程序架构的约束之一。
HATEOAS 将显示给定资源的相关链接的概念引入了 RESTful 服务。当我们返回特定资源的详细信息时,我们还会返回指向可以对该资源执行的操作的链接,以及指向相关资源的链接。如果服务消费者可以使用响应中的链接来执行事务,那么它就不需要对所有链接进行硬编码。
让我们在实践中看看如何做到这一点。使用“web”和“hateoas”启动器构建一个新项目:
spring init -dweb,hateoas demo-hateoas
将包括以下依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
为简单起见,我们将创建一个 In-Memory 存储库以使用 hatoas 进行查询,如本教程所述:如何在 Spring Boot 中定义模拟存储库
让我们从模型开始:
package com.example.demohateoas.model;
public class Customer {
private final Long id;
private final String firstName;
private final String lastName;
public Customer(Long id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public Long getId() {
return this.id;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
我们将添加一个简单的界面:
package com.example.demohateoas;
import java.util.List;
public interface CustomerRepository {
List<Customer> findAll();
Customer findCustomer(Long id);
}
现在我们将定义一个使用@Repository 标记的接口的实现:
package com.example.demohateoas;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import org.springframework.util.ObjectUtils;
@Repository
public class MockCustomerRepository implements CustomerRepository {
private final List<Customer> customers = new ArrayList<>();
public MockCustomerRepository() {
this.customers.add(new Customer(1L, "John", "Smith"));
this.customers.add(new Customer(2L, "Mark", "Spencer"));
this.customers.add(new Customer(2L, "Andy", "Doyle"));
}
@Override
public List<Customer> findAll() {
return this.customers;
}
@Override
public Customer findOne(Long id) {
for (Customer customer : this.customers) {
if (ObjectUtils.nullSafeEquals(customer.getId(), id)) {
return customer;
}
}
return null;
}
}
最有趣的部分来了。我们将添加一个控制器来利用响应中的链接:
package com.example.demohateoas.controller;
import org.springframework.hateoas.EntityLinks;
import org.springframework.hateoas.ExposesResourceFor;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.Resources;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.demohateoas.model.Customer;
import com.example.demohateoas.model.CustomerRepository;
@Controller
@RequestMapping("/customers")
@ExposesResourceFor(Customer.class)
public class CustomerController {
private final CustomerRepository repository;
private final EntityLinks entityLinks;
public CustomerController(CustomerRepository repository, EntityLinks entityLinks) {
this.repository = repository;
this.entityLinks = entityLinks;
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
HttpEntity<Resources<Customer>> showCustomers() {
Resources<Customer> resources = new Resources<>(this.repository.findAll());
resources.add(this.entityLinks.linkToCollectionResource(Customer.class));
return new ResponseEntity<>(resources, HttpStatus.OK);
}
@GetMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
HttpEntity<Resource<Customer>> showCustomer(@PathVariable Long id) {
Resource<Customer> resource = new Resource<>(this.repository.findOne(id));
resource.add(this.entityLinks.linkToSingleResource(Customer.class, id));
return new ResponseEntity<>(resource, HttpStatus.OK);
}
}
如您所见,从 GET 请求返回的关键类是 org.springframework.hateoas.Resource 和 org.springframework.hateoas.Resources,它们是简单的 Resources 包装了能够向其添加链接的域对象。如果必须使用链接丰富单个资源,则使用方法 linkToSingleResource。另一方面,对于集合,则使用linkToCollectionResource。
Main 应用程序类完成了应用程序:
package com.example.demohateoas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
如果您构建并运行应用程序,您将看到在 Root Web 上下文和 /{id} 路径中都提供了一个链接,以启用导航:
在本教程中,我们了解了 HATEOAS 如何通过在响应中包含超媒体链接来提供信息以动态导航站点的 REST 接口。然而,这种能力不同于基于 SOA 的系统和 WSDL 驱动的接口,服务器和客户端通常必须访问一个固定的规范,该规范可能在网站的其他地方、另一个网站上进行。
使用很棒的 HATEOAS 链接功能我正在尝试输出模板化的 url 以突出显示用户可用的过滤器参数 示例 Controller 方法 @RequestMapping(value = "/persons
我正在使用 spring-hateoas:0.18.0.RELEASE 与 spring-boot:1.2.5.RELEASE 为了调用我的 Web 服务并通过 HAL 链接,我正在使用 特拉弗森客户
我使用 Spring HATEOAS 在我的应用程序中创建 REST HATEOAS API。到目前为止它运行良好,但当涉及到嵌套资源时我陷入困境。将此类层次结构映射到 REST HATEOAS 资源
我想弄清楚如何使用 templated: true 建立 HAL 链接.如果我使用 BasicLinkBuilder.linkToCurrentMapping().slash("api/public/
我们使用 HATEOAS 取得了很好的效果,但是我们一直在关注性能,并且从链接的构建中得到了非常糟糕的结果,即看起来像这样的代码 resource.add(linkTo(methodOn(SomeCo
我有一个带有请求参数的方法,我正在尝试从另一个资源链接到这个方法。我希望链接是这样的: "rel":{ "href":".../resources{?param}", "templated":
我想链接到具有以下签名的方法: public SomeResponse getSomeObjects(@RequestParam(value = "foo", defaultValue = "bar"
我正在构建一个REST API。我有一个由bean组成的域模型,无法扩展ResourceSupport。使用Spring-HATEOAS将它们公开为资源的最佳方法是什么? 如果不可能,在bean生成的
我有这个问题已经在我的脑海里盘旋了一段时间。让我们假设我们已经在不同的层上构建了我们的项目,后端和前端。所以,从前端,我们想要一个客户,它来自 hal+json格式: GET /customers/1
我有一个关于 Spring HATEOAS 的表示模型处理器的问题。我们正在尝试在将模型序列化给客户端之前对其进行处理。我们的用例是丰富 imageUrl领域UserModel对象在运行时,因为我们必
想象一下,我有一个完全实现的REST API,它也提供了HATEOAS。 假设我浏览了根目录,除了自我链接之外,还返回了其他两个链接(例如,一个用于/users和一个用于/orders)。据我所知,H
据说在定义良好的 RESTful 系统中,客户端只需要知道根 URI 或几个众所周知的 URI,客户端将通过这些初始 URI 发现所有其他链接。我确实理解这种方法的好处(解耦客户端),但对我来说不利的
遵循 HATEOAS 原则,每个状态都应该是超链接的,对改变资源状态的链接进行建模的最佳方法是什么? 让我们以订单为例: { id : 12, state: 'pending', .
我试图对 HATEOAS 有一个清晰、简洁的理解,而且我绝不是 WRT REST 专家。 (我想我明白了,感谢这个 http://www.looah.com/source/view/2284 )。 有
我有理由相信我了解 HATEOAS 设计的服务器端 - 在响应中返回状态 URL - 但我对如何设计客户端来接受这些感到有点困惑。 例如,我们在//somehost.com/resource/1 访问
我正在阅读有关 spring-hateoas 的内容,看起来 1.0 有很多变化。我想切换到 1.0 但是我的 pom.xml 正在引入 0.25.2。 我试过用 org
我正在努力了解 HATEOAS。 让我们通过一个例子来工作。客户端将浏览器加载到 getemails.com。为简单起见,让我们假设对 getemails.com 的调用访问了服务器并返回一个电子邮件
我有 Spring Data Rest 和 Hateoas 作为我的支持。它在代理后面。 后端网址:backend.com 代理网址:proxy.com 当我查询代理网址时,例如http://prox
我可以有一些 HATEOAS 的示例/典型用例吗? ?我同意它可以是一个非常强大的概念,提供了很大的灵活性,但我不确定如何正确地从 HATEOAS 中受益。如果您可以分享您的经验/用例,那就太好了。
HATEOAS(作为应用程序状态引擎的超媒体)建议是否暗示查询字符串不是 RESTful? 编辑:下面建议查询字符串可能与状态没有太大关系,因此这个问题令人费解。我建议 URI 具有查询字符串没有意义
我是一名优秀的程序员,十分优秀!