微服务架构之Spring Boot(七十三)

2022-05-23 15:44:14 浏览数 (1)

53.7.1接收输入

端点上的操作通过其参数接收输入。通过Web公开时,这些参数的值取自URL的查询参数和JSON请求体。通过JMX公开时,参数将映射到

MBean操作的参数。默认情况下需要参数。可以通过使用 @org.springframework.lang.Nullable 注释它们来使它们成为可选项。

JSON请求正文中的每个根属性都可以映射到端点的参数。请考虑以下JSON请求正文:

{

"name": "test",

"counter": 42

}

这可用于调用带有 String name 和 int counter 参数的写操作。

由于端点与技术无关,因此只能在方法签名中指定简单类型。特别是不支持使用定义 name 和 counter 属性的自定义类型声明单

个参数。

要允许输入映射到操作方法的参数,实现端点的Java代码应使用 -parameters 进行编译,实现端点的Kotlin代码应使

用 -java-parameters 进行编译。如果您使用的是Spring Boot的Gradle插件,或者您使用的是Maven

和 spring-boot-starter-parent ,则会自动执行此操作。

输入类型转换

如有必要,传递给端点操作方法的参数将自动转换为所需类型。在调用操作方法之前,通过JMX或HTTP请求接收的输入将使

用 ApplicationConversionService 的实例转换为所需类型。

53.7.2自定义Web端点

@Endpoint , @WebEndpoint 或 @EndpointWebExtension 上的操作将使用Jersey,Spring MVC或Spring WebFlux通过HTTP自动公开。

Web端点请求谓词

为Web暴露的端点上的每个操作自动生成请求谓词。

路径

谓词的路径由端点的ID和Web暴露的端点的基本路径确定。默认基本路径为 /actuator 。例如,ID为 sessions 的端点将使

用 /actuator/sessions 作为谓词中的路径。

可以通过使用 @Selector 注释操作方法的一个或多个参数来进一步定制路径。这样的参数作为路径变量添加到路径谓词中。调用端点操作时,

将变量的值传递给操作方法。

HTTP方法

谓词的HTTP方法由操作类型决定,如下表所示:

消费

对于使用请求主体的 @WriteOperation (HTTP POST ),谓词的consumemes子句

为 application/vnd.spring-boot.actuator.v2 json, application/json 。对于所有其他操作,consumemes子句为空。

产生

谓词的produce子句可以由 @DeleteOperation , @ReadOperation 和 @WriteOperation 注释的 produces 属性确定。该属性是可选的。如果

未使用,则自动确定produce子句。

如果操作方法返回 void 或 Void ,则produce子句为空。如果操作方法返回 org.springframework.core.io.Resource ,则produce子句

为 application/octet-stream 。对于所有其他操作,produce子句

是 application/vnd.spring-boot.actuator.v2 json, application/json 。

Web端点响应状态

端点操作的默认响应状态取决于操作类型(读取,写入或删除)以及操作返回的内容(如果有)。

@ReadOperation 返回一个值,响应状态为200(OK)。如果它未返回值,则响应状态将为404(未找到)。

如果 @WriteOperation 或 @DeleteOperation 返回值,则响应状态将为200(OK)。如果它没有返回值,则响应状态将为204(无内容)。

如果在没有必需参数的情况下调用操作,或者使用无法转换为所需类型的参数,则不会调用操作方法,并且响应状态将为400(错误请求)。

Web端点范围请求

HTTP范围请求可用于请求HTTP资源的一部分。使用Spring MVC或Spring Web Flux时,返回 org.springframework.core.io.Resource 的

操作会自动支持范围请求。

使用Jersey时不支持范围请求。

Web端点安全

Web端点或特定于Web的端点扩展上的操作可以接收当前 java.security.Principal

或 org.springframework.boot.actuate.endpoint.SecurityContext 作为方法参数。前者通常与 @Nullable 结合使用,为经过身份验证和

未经身份验证的用户提供不同的行为。后者通常用于使用 isUserInRole(String) 方法执行授权检查。

53.7.3 Servlet端点

通过实现一个注释为 @ServletEndpoint 且同时实现 Supplier<EndpointServlet> 的类,可以将 Servlet 公开为端点。Servlet端点提供与

Servlet容器更深层次的集成,但代价是可移植性。它们旨在用于将现有的 Servlet 作为端点公开。对于新端点,应尽可能优先选择 @Endpoint

和 @WebEndpoint 注释。

53.7.4控制器端点

@ControllerEndpoint 和 @RestControllerEndpoint 可用于实现仅由Spring MVC或Spring WebFlux公开的端点。使用Spring MVC和

Spring WebFlux的标准注释(例如 @RequestMapping 和 @GetMapping )映射方法,并将端点的ID用作路径的前缀。控制器端点提供与Spring

Web框架的更深层次集成,但代价是可移植性。应尽可能优先考虑 @Endpoint 和 @WebEndpoint 注释。

0 人点赞