此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Data REST 5.0.4spring-doc.cadn.net.cn

仓库资源

基础

Spring Data REST 的核心功能是为 Spring Data 仓库导出资源。因此,要查看并可能自定义导出方式的核心组件就是仓库接口。请考虑以下仓库接口:spring-doc.cadn.net.cn

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

对于该仓库,Spring Data REST 在 /orders 路径下暴露一个集合资源。该路径源自所管理领域类的非大写、复数形式的简单类名。它还在 URI 模板 /orders/{id} 下为仓库管理的每个项目暴露一个单项资源。spring-doc.cadn.net.cn

默认情况下,用于与这些资源交互的 HTTP 方法会映射到 CrudRepository 的相应方法。更多内容请参阅集合资源单个资源相关章节。spring-doc.cadn.net.cn

仓库方法暴露

某个仓库所暴露的 HTTP 资源主要由该仓库的结构决定。 换句话说,资源的暴露取决于你在仓库中公开了哪些方法。 如果你继承了 CrudRepository,通常会暴露所有默认情况下我们能够注册的 HTTP 资源所需的方法。 下面列出的每个资源都会明确说明需要具备哪些方法,才能为该资源暴露特定的 HTTP 方法。 这意味着,如果仓库没有暴露这些方法——无论是根本没有声明这些方法,还是显式使用了 @RestResource(exported = false)——那么这些 HTTP 方法将不会在对应的资源上被暴露。spring-doc.cadn.net.cn

有关如何调整默认方法暴露或单独定制特定 HTTP 方法的详细信息,请参阅自定义支持的 HTTP 方法spring-doc.cadn.net.cn

默认状态码

对于所暴露的资源,我们使用一组默认的状态码:spring-doc.cadn.net.cn

  • 200 OK:用于普通的 GET 请求。spring-doc.cadn.net.cn

  • 201 Created:用于创建新资源的 POSTPUT 请求。spring-doc.cadn.net.cn

  • 204 No Content: 当配置设置为不为资源更新返回响应体(RepositoryRestConfiguration.setReturnBodyOnUpdate(…))时,针对 PUTPATCHDELETE 请求。 如果配置值设置为包含 PUT 的响应,则更新操作将返回 200 OK,而通过 PUT 创建的资源将返回 201 Createdspring-doc.cadn.net.cn

如果配置值(RepositoryRestConfiguration.returnBodyOnUpdate(…)RepositoryRestConfiguration.returnBodyCreate(…))被显式设置为 null(默认情况下即是如此),则将根据 HTTP Accept 请求头是否存在来决定响应码。 有关此行为的更多详细信息,请参阅集合资源单项资源的详细说明。spring-doc.cadn.net.cn

资源可发现性

HATEOAS 的一个核心原则是:资源应通过发布指向可用资源的链接来实现可发现性。目前存在几种相互竞争的、事实上的标准,用于在 JSON 中表示链接。默认情况下,Spring Data REST 使用 HAL 来渲染响应。HAL 规定链接应包含在返回文档的一个属性中。spring-doc.cadn.net.cn

资源发现从应用程序的顶层开始。客户端向 Spring Data REST 应用程序部署的根 URL 发起请求后,可以从返回的 JSON 对象中提取出一组链接,这些链接代表了客户端可访问的下一级资源。spring-doc.cadn.net.cn

例如,要发现应用程序根路径下有哪些资源可用,请向根 URL 发送一个 HTTP GET 请求,如下所示:spring-doc.cadn.net.cn

curl -v http://localhost:8080/

< HTTP/1.1 200 OK
< Content-Type: application/hal+json

{ "_links" : {
    "orders" : {
      "href" : "http://localhost:8080/orders"
    },
    "profile" : {
      "href" : "http://localhost:8080/api/alps"
    }
  }
}

结果文档的 property 属性是一个对象,该对象由表示关系类型的键组成,其值为 HAL 中指定的嵌套链接对象。spring-doc.cadn.net.cn

有关 profile 链接的更多详细信息,请参阅应用程序级配置文件语义(ALPS)

集合资源

Spring Data REST 会暴露一个集合资源,其名称基于所导出仓库所处理的领域类的小写复数形式。通过在仓库接口上使用 @RepositoryRestResource 注解,可以自定义该资源的名称和路径。spring-doc.cadn.net.cn

支持的 HTTP 方法

集合资源同时支持 GETPOST。所有其他 HTTP 方法将导致 405 Method Not Allowed(方法不允许)。spring-doc.cadn.net.cn

GET

通过其 findAll(…) 方法返回该仓库所服务的所有实体。 如果该仓库是一个分页仓库,我们会根据需要包含分页链接以及额外的页面元数据。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

参数

如果仓库具有分页功能,则该资源将接受以下参数:spring-doc.cadn.net.cn

自定义状态码

GET 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 findAll(…) 方法未被导出(通过 @RestResource(exported = false))或在仓库中不存在。spring-doc.cadn.net.cn

支持的媒体类型

GET 方法支持以下媒体类型:spring-doc.cadn.net.cn

GET 方法支持一个单一链接,用于发现相关资源:spring-doc.cadn.net.cn

HEAD

HEAD 方法用于返回集合资源是否可用。它没有状态码、媒体类型或相关资源。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

POST

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

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

自定义状态码

POST 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 save(…) 方法未被导出(通过 @RestResource(exported = false))或者在仓库中根本不存在。spring-doc.cadn.net.cn

支持的媒体类型

POST 方法支持以下媒体类型:spring-doc.cadn.net.cn

项目资源

Spring Data REST 将单个集合项的资源作为集合资源的子资源进行暴露。spring-doc.cadn.net.cn

支持的 HTTP 方法

Item 资源通常支持 GETPUTPATCHDELETE,除非显式配置禁止了这些操作(详情请参见“关联资源”)。spring-doc.cadn.net.cn

GET

GET 方法返回单个实体。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

自定义状态码

GET 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 findOne(…) 方法未被导出(通过 @RestResource(exported = false))或在仓库中不存在。spring-doc.cadn.net.cn

支持的媒体类型

GET 方法支持以下媒体类型:spring-doc.cadn.net.cn

对于领域类型的每个关联,我们都会暴露以关联属性命名的链接。您可以通过在属性上使用 @RestResource 注解来自定义此行为。相关资源属于关联资源类型。spring-doc.cadn.net.cn

HEAD

HEAD 方法用于返回指定资源是否可用。它不包含状态码、媒体类型或相关资源。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

PUT

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

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

自定义状态码

PUT 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 save(…) 方法未被导出(通过 @RestResource(exported = false))或者在仓库中根本不存在。spring-doc.cadn.net.cn

支持的媒体类型

PUT 方法支持以下媒体类型:spring-doc.cadn.net.cn

PATCH

PATCH 方法与 PUT 方法类似,但用于部分更新资源的状态。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

自定义状态码

PATCH 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 save(…) 方法未被导出(通过 @RestResource(exported = false))或在仓库中不存在。spring-doc.cadn.net.cn

DELETE

DELETE 方法用于删除所暴露的资源。 默认情况下,响应是否包含主体内容由请求中发送的 Accept 请求头控制。 如果存在该请求头,则返回响应主体和状态码 200 OK。 如果未提供该请求头,则响应主体为空,成功请求返回的状态码为 204 No Content。 通过相应地配置 RepositoryRestConfiguration.setReturnBodyOnDelete(…),可以覆盖此默认行为。spring-doc.cadn.net.cn

用于调用的方法

如果存在以下方法,则按以下顺序(从高到低)使用:spring-doc.cadn.net.cn

有关方法默认暴露的更多信息,请参见Repository 方法暴露spring-doc.cadn.net.cn

自定义状态码

DELETE 方法只有一个自定义状态码:spring-doc.cadn.net.cn

  • 405 Method Not Allowed:如果 delete(…) 方法未被导出(通过 @RestResource(exported = false))或在仓库中不存在。spring-doc.cadn.net.cn

协会资源

Spring Data REST 会为每个项目资源(item resource)的每个关联关系暴露对应的子资源(sub-resources)。该资源的名称和路径默认使用关联属性的名称,也可以通过在关联属性上使用 @RestResource 注解进行自定义。spring-doc.cadn.net.cn

支持的 HTTP 方法

关联资源支持以下媒体类型:spring-doc.cadn.net.cn

GET

GET 方法返回关联资源的状态。spring-doc.cadn.net.cn

支持的媒体类型

GET 方法支持以下媒体类型:spring-doc.cadn.net.cn

PUT

PUT 方法将给定 URI 所指向的资源绑定到关联资源(参见支持的媒体类型)。spring-doc.cadn.net.cn

自定义状态码

PUT 方法只有一个自定义状态码:spring-doc.cadn.net.cn

支持的媒体类型

PUT 方法仅支持一种媒体类型:spring-doc.cadn.net.cn

POST

POST 方法仅支持集合关联。它会向集合中添加一个新元素。spring-doc.cadn.net.cn

支持的媒体类型

POST 方法仅支持一种媒体类型:spring-doc.cadn.net.cn

DELETE

DELETE 方法会解除该关联。spring-doc.cadn.net.cn

自定义状态码

POST 方法只有一个自定义状态码:spring-doc.cadn.net.cn

搜索资源

搜索资源会返回该仓库所公开的所有查询方法的链接。可以通过在方法声明上使用 @RestResource 注解来修改查询方法资源的路径和名称。spring-doc.cadn.net.cn

支持的 HTTP 方法

由于搜索资源是只读资源,因此仅支持 GET 方法。spring-doc.cadn.net.cn

GET

GET 方法返回一个链接列表,这些链接指向各个查询方法资源。spring-doc.cadn.net.cn

支持的媒体类型

GET 方法支持以下媒体类型:spring-doc.cadn.net.cn

对于在仓库中声明的每个查询方法,我们都会暴露一个查询方法资源。如果该资源支持分页,则指向它的 URI 是一个包含分页参数的 URI 模板。spring-doc.cadn.net.cn

HEAD

HEAD 方法用于返回搜索资源是否可用。返回状态码 404 表示没有可用的查询方法资源。spring-doc.cadn.net.cn

查询方法资源

查询方法资源通过仓库接口上的单个查询方法来执行所暴露的查询。spring-doc.cadn.net.cn

支持的 HTTP 方法

由于查询方法资源是只读资源,因此仅支持 GET 方法。spring-doc.cadn.net.cn

GET

GET 方法返回查询的结果。spring-doc.cadn.net.cn

参数

如果查询方法具有分页功能(在指向资源的 URI 模板中指明),则该资源将接受以下参数:spring-doc.cadn.net.cn

支持的媒体类型

GET 方法支持以下媒体类型:spring-doc.cadn.net.cn

HEAD

HEAD 方法用于返回查询方法资源是否可用。spring-doc.cadn.net.cn