资源库资源

基础

Spring Data REST 的核心功能是为 Spring Data 存储库导出资源。因此,要查看和可能自定义导出方式的核心工件是存储库接口。考虑以下存储库接口

public interface OrderRepository extends CrudRepository<Order, Long> { }

对于此存储库,Spring Data REST 在 /orders 上公开一个集合资源。路径是从所管理的域类的非大写、复数、简单类名派生的。它还为存储库管理的每个项目在 URI 模板 /orders/{id} 下公开一个项目资源。

默认情况下,与这些资源交互的 HTTP 方法映射到 CrudRepository 的相应方法。有关详细信息,请参阅有关 集合资源项目资源 的部分。

存储库方法公开

为特定存储库公开哪些 HTTP 资源主要由存储库的结构决定。换句话说,资源公开将遵循您在存储库上公开的方法。如果您扩展 CrudRepository,您通常会公开所有方法,这些方法需要公开我们可以默认注册的所有 HTTP 资源。下面列出的每个资源将定义需要存在哪些方法,以便可以为每个资源公开特定的 HTTP 方法。这意味着,没有公开这些方法的存储库(无论是不声明它们还是显式使用 @RestResource(exported = false))都不会在这些资源上公开这些 HTTP 方法。

有关如何调整默认方法公开或单独的 HTTP 方法的详细信息,请参阅 自定义支持的 HTTP 方法

默认状态代码

对于公开的资源,我们使用一组默认状态代码

  • 200 OK:对于普通的 GET 请求。

  • 201 Created:对于创建新资源的 POSTPUT 请求。

  • 204 No Content:对于 PUTPATCHDELETE 请求,当配置设置为不返回资源更新的响应主体时 (RepositoryRestConfiguration.setReturnBodyOnUpdate(…))。如果配置值设置为包含 PUT 的响应,则更新返回 200 OK,而通过 PUT 创建的资源返回 201 Created

如果配置值(RepositoryRestConfiguration.returnBodyOnUpdate(…)RepositoryRestConfiguration.returnBodyCreate(…))显式设置为 null(默认情况下它们是),则使用 HTTP Accept 标头来确定响应代码。有关此内容的更多信息,请参阅 集合项目资源 的详细说明。

资源可发现性

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 方法

集合资源支持 GETPOST。所有其他 HTTP 方法都会导致 405 Method Not Allowed

GET

返回存储库通过其 findAll(…) 方法服务器的所有实体。如果存储库是分页存储库,我们将包括分页链接(如果需要)以及其他页面元数据。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • findAll(Pageable)

  • findAll(Sort)

  • findAll()

有关方法默认暴露的更多信息,请参见 资源库方法暴露

参数

如果资源库具有分页功能,则资源将采用以下参数

  • page: 要访问的页码(从 0 开始索引,默认值为 0)。

  • size: 请求的页面大小(默认值为 20)。

  • sort: 排序指令的集合,格式为 ($propertyname,)+[asc|desc]?。

自定义状态代码

GET 方法只有一个自定义状态代码

  • 405 Method Not Allowed: 如果 findAll(…) 方法未导出(通过 @RestResource(exported = false))或不存在于资源库中。

支持的媒体类型

GET 方法支持以下媒体类型

  • application/hal+json

  • application/json

GET 方法支持一个用于发现相关资源的链接

  • search: 如果后端资源库公开查询方法,则会公开一个 搜索资源

HEAD

HEAD 方法返回集合资源是否可用。它没有状态代码、媒体类型或相关资源。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • findAll(Pageable)

  • findAll(Sort)

  • findAll()

有关方法默认暴露的更多信息,请参见 资源库方法暴露

POST

POST 方法根据给定的请求主体创建一个新实体。默认情况下,响应是否包含主体由请求中发送的 Accept 标头控制。如果发送了标头,则会创建响应主体。如果没有,则响应主体为空,可以通过 Location 响应标头中包含的链接获取所创建资源的表示形式。可以通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnCreate(…) 来覆盖此行为。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • save(…)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

自定义状态代码

POST 方法只有一个自定义状态代码

  • 405 Method Not Allowed: 如果 save(…) 方法未导出(通过 @RestResource(exported = false))或根本不存在于资源库中。

支持的媒体类型

POST 方法支持以下媒体类型

  • application/hal+json

  • application/json

项目资源

Spring Data REST 将单个集合项的资源公开为集合资源的子资源。

支持的 HTTP 方法

项目资源通常支持 GETPUTPATCHDELETE,除非显式配置阻止(有关详细信息,请参阅“关联资源”)。

GET

GET 方法返回单个实体。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • findById(…)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

自定义状态码

GET 方法只有一个自定义状态代码

  • 405 Method Not Allowed:如果 findOne(…) 方法未导出(通过 @RestResource(exported = false))或在存储库中不存在。

支持的媒体类型

GET 方法支持以下媒体类型

  • application/hal+json

  • application/json

对于域类型的每个关联,我们都公开以关联属性命名的链接。您可以使用属性上的 @RestResource 自定义此行为。相关资源属于 关联资源 类型。

HEAD

HEAD 方法返回项目资源是否可用。它没有状态码、媒体类型或相关资源。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • findById(…)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

PUT

PUT 方法将目标资源的状态替换为提供的请求正文。默认情况下,响应是否包含正文由请求发送的 Accept 标头控制。如果请求标头存在,则返回响应正文和 200 OK 的状态码。如果不存在标头,则响应正文为空,成功请求返回 204 No Content 的状态。可以通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnUpdate(…) 来覆盖此行为。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • save(…)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

自定义状态码

PUT 方法只有一个自定义状态码

  • 405 Method Not Allowed:如果 save(…) 方法未导出(通过 @RestResource(exported = false))或根本不存在于存储库中。

支持的媒体类型

PUT 方法支持以下媒体类型

  • application/hal+json

  • application/json

PATCH

PATCH 方法类似于 PUT 方法,但它部分更新资源状态。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • save(…)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

自定义状态码

PATCH 方法只有一个自定义状态码

  • 405 Method Not Allowed: 如果 save(…) 方法未导出(通过 @RestResource(exported = false))或不存在于存储库中。

支持的媒体类型

PATCH 方法支持以下媒体类型

DELETE

DELETE 方法删除公开的资源。默认情况下,响应是否包含主体由请求中发送的 Accept 标头控制。如果请求标头存在,则返回响应主体和 200 OK 状态码。如果不存在标头,则响应主体为空,成功请求返回 204 No Content 状态。此行为可以通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnDelete(…) 来覆盖。

用于调用的方法

如果存在以下方法,则使用它们(降序)

  • delete(T)

  • delete(ID)

  • delete(Iterable)

有关方法默认暴露的更多信息,请参见 资源库方法暴露

自定义状态码

DELETE 方法只有一个自定义状态码

  • 405 Method Not Allowed: 如果 delete(…) 方法未导出(通过 @RestResource(exported = false))或不存在于存储库中。

关联资源

Spring Data REST 为每个项目资源公开每个关联的子资源。资源的名称和路径默认为关联属性的名称,可以使用关联属性上的 @RestResource 进行自定义。

支持的 HTTP 方法

关联资源支持以下媒体类型

  • GET

  • PUT

  • POST

  • DELETE

GET

GET 方法返回关联资源的状态。

支持的媒体类型

GET 方法支持以下媒体类型

  • application/hal+json

  • application/json

PUT

PUT 方法将给定 URI 指向的资源绑定到关联资源(参见支持的媒体类型)。

自定义状态代码

PUT 方法只有一个自定义状态码

  • 400 Bad Request:当为一对一关联提供多个 URI 时。

支持的媒体类型

PUT 方法仅支持一种媒体类型

  • text/uri-list:指向要绑定到关联的资源的 URI。

POST

POST 方法仅支持集合关联。它向集合添加一个新元素。

支持的媒体类型

POST 方法仅支持一种媒体类型

  • text/uri-list:指向要添加到关联的资源的 URI。

DELETE

DELETE 方法解除关联。

自定义状态代码

POST 方法只有一个自定义状态代码

  • 405 Method Not Allowed:当关联是非可选的。

搜索资源

搜索资源返回存储库公开的所有查询方法的链接。查询方法资源的路径和名称可以使用方法声明上的 @RestResource 进行修改。

支持的 HTTP 方法

由于搜索资源是只读资源,因此它仅支持 GET 方法。

GET

GET 方法返回指向各个查询方法资源的链接列表。

支持的媒体类型

GET 方法支持以下媒体类型

  • application/hal+json

  • application/json

对于在存储库中声明的每个查询方法,我们都公开了一个 查询方法资源。如果资源支持分页,指向它的 URI 是包含分页参数的 URI 模板。

HEAD

HEAD 方法返回搜索资源是否可用。404 返回代码表示没有可用的查询方法资源。

查询方法资源

查询方法资源通过存储库接口上的单个查询方法运行公开的查询。

支持的 HTTP 方法

由于查询方法资源是只读资源,因此它仅支持 GET

GET

GET 方法返回查询的结果。

参数

如果查询方法具有分页功能(在指向资源的 URI 模板中指示),则资源将采用以下参数

  • page: 要访问的页码(从 0 开始索引,默认值为 0)。

  • size: 请求的页面大小(默认值为 20)。

  • sort: 排序指令的集合,格式为 ($propertyname,)+[asc|desc]?。

支持的媒体类型

GET 方法支持以下媒体类型

  • application/hal+json

  • application/json

HEAD

HEAD 方法返回查询方法资源是否可用。