资源库资源
基础
Spring Data REST 的核心功能是为 Spring Data 存储库导出资源。因此,要查看和可能自定义导出方式的核心工件是存储库接口。考虑以下存储库接口
public interface OrderRepository extends CrudRepository<Order, Long> { }
对于此存储库,Spring Data REST 在 /orders
上公开一个集合资源。路径是从所管理的域类的非大写、复数、简单类名派生的。它还为存储库管理的每个项目在 URI 模板 /orders/{id}
下公开一个项目资源。
存储库方法公开
为特定存储库公开哪些 HTTP 资源主要由存储库的结构决定。换句话说,资源公开将遵循您在存储库上公开的方法。如果您扩展 CrudRepository
,您通常会公开所有方法,这些方法需要公开我们可以默认注册的所有 HTTP 资源。下面列出的每个资源将定义需要存在哪些方法,以便可以为每个资源公开特定的 HTTP 方法。这意味着,没有公开这些方法的存储库(无论是不声明它们还是显式使用 @RestResource(exported = false)
)都不会在这些资源上公开这些 HTTP 方法。
有关如何调整默认方法公开或单独的 HTTP 方法的详细信息,请参阅 自定义支持的 HTTP 方法。
默认状态代码
对于公开的资源,我们使用一组默认状态代码
-
200 OK
:对于普通的GET
请求。 -
201 Created
:对于创建新资源的POST
和PUT
请求。 -
204 No Content
:对于PUT
、PATCH
和DELETE
请求,当配置设置为不返回资源更新的响应主体时 (RepositoryRestConfiguration.setReturnBodyOnUpdate(…)
)。如果配置值设置为包含PUT
的响应,则更新返回200 OK
,而通过PUT
创建的资源返回201 Created
。
资源可发现性
HATEOAS 的核心原则是在资源中发布指向可用资源的链接,以便可以发现资源。在 JSON 中表示链接的方式存在一些相互竞争的事实上的标准。默认情况下,Spring Data REST 使用 HAL 来呈现响应。HAL 将链接定义为包含在返回文档的属性中。
资源发现从应用程序的顶层开始。通过向部署 Spring Data REST 应用程序的根 URL 发出请求,客户端可以从返回的 JSON 对象中提取一组链接,这些链接表示可供客户端使用的下一级资源。
例如,要发现应用程序根目录下有哪些资源,请向根 URL 发出 HTTP GET
请求,如下所示
curl -v https://127.0.0.1:8080/
< HTTP/1.1 200 OK
< Content-Type: application/hal+json
{ "_links" : {
"orders" : {
"href" : "https://127.0.0.1:8080/orders"
},
"profile" : {
"href" : "https://127.0.0.1:8080/api/alps"
}
}
}
结果文档的属性是一个对象,该对象包含表示关系类型的键,以及 HAL 中指定的嵌套链接对象。
有关 profile 链接的更多详细信息,请参阅 应用程序级配置文件语义 (ALPS)。
|
集合资源
Spring Data REST 公开了一个名为集合资源,该资源以导出存储库处理的域类的非大写复数形式命名。可以通过在存储库接口上使用 @RepositoryRestResource
来自定义资源名称和路径。
支持的 HTTP 方法
集合资源支持 GET
和 POST
。所有其他 HTTP 方法都会导致 405 Method Not Allowed
。
GET
返回存储库通过其 findAll(…)
方法服务器的所有实体。如果存储库是分页存储库,我们将包括分页链接(如果需要)以及其他页面元数据。
参数
如果资源库具有分页功能,则资源将采用以下参数
-
page
: 要访问的页码(从 0 开始索引,默认值为 0)。 -
size
: 请求的页面大小(默认值为 20)。 -
sort
: 排序指令的集合,格式为($propertyname,)+[asc|desc]
?。
POST
POST
方法根据给定的请求主体创建一个新实体。默认情况下,响应是否包含主体由请求中发送的 Accept
标头控制。如果发送了标头,则会创建响应主体。如果没有,则响应主体为空,可以通过 Location
响应标头中包含的链接获取所创建资源的表示形式。可以通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnCreate(…)
来覆盖此行为。
项目资源
Spring Data REST 将单个集合项的资源公开为集合资源的子资源。
支持的 HTTP 方法
项目资源通常支持 GET
、PUT
、PATCH
和 DELETE
,除非显式配置阻止(有关详细信息,请参阅“关联资源”)。
GET
GET
方法返回单个实体。
自定义状态码
GET
方法只有一个自定义状态代码
-
405 Method Not Allowed
:如果findOne(…)
方法未导出(通过@RestResource(exported = false)
)或在存储库中不存在。
相关资源
对于域类型的每个关联,我们都公开以关联属性命名的链接。您可以使用属性上的 @RestResource
自定义此行为。相关资源属于 关联资源 类型。
PUT
PUT
方法将目标资源的状态替换为提供的请求正文。默认情况下,响应是否包含正文由请求发送的 Accept
标头控制。如果请求标头存在,则返回响应正文和 200 OK
的状态码。如果不存在标头,则响应正文为空,成功请求返回 204 No Content
的状态。可以通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnUpdate(…)
来覆盖此行为。
PATCH
PATCH
方法类似于 PUT
方法,但它部分更新资源状态。
自定义状态码
PATCH
方法只有一个自定义状态码
-
405 Method Not Allowed
: 如果save(…)
方法未导出(通过@RestResource(exported = false)
)或不存在于存储库中。
关联资源
搜索资源
搜索资源返回存储库公开的所有查询方法的链接。查询方法资源的路径和名称可以使用方法声明上的 @RestResource
进行修改。
支持的 HTTP 方法
由于搜索资源是只读资源,因此它仅支持 GET
方法。
GET
GET
方法返回指向各个查询方法资源的链接列表。
相关资源
对于在存储库中声明的每个查询方法,我们都公开了一个 查询方法资源。如果资源支持分页,指向它的 URI 是包含分页参数的 URI 模板。