前言
对于Java相关方面的知识补充,推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
1. 基本知识
接口是Spring Framework中的ServerHttpResponse接口,用于表示服务器端的HTTP响应
对于该接口的详细知识
先看其源码:
public interface ServerHttpResponse extends ReactiveHttpOutputMessage {
/**
* Set the HTTP status code of the response.
* @param status the HTTP status as an {@link HttpStatus} enum value
* @return {@code false} if the status code has not been set because the
* HTTP response is already committed, {@code true} if successfully set.
*/
boolean setStatusCode(@Nullable HttpStatus status);
/**
* Return the status code set via {@link #setStatusCode}, or if the status
* has not been set, return the default status code from the underlying
* server response. The return value may be {@code null} if the status code
* value is outside the {@link HttpStatus} enum range, or if the underlying
* server response does not have a default value.
*/
@Nullable
HttpStatus getStatusCode();
/**
* Return a mutable map with the cookies to send to the server.
*/
MultiValueMap<String, ResponseCookie> getCookies();
/**
* Add the given {@code ResponseCookie}.
* @param cookie the cookie to add
* @throws IllegalStateException if the response has already been committed
*/
void addCookie(ResponseCookie cookie);
}
对应各个接口诠释如下:
-
setStatusCode(HttpStatus status)
方法:设置HTTP响应的状态码
返回true表示成功设置状态码,返回false表示HTTP响应已经被提交,无法设置状态码 -
getStatusCode()
方法:获取HTTP响应的状态码(返回值类型为HttpStatus枚举,可能为null)
状态码通过setStatusCode()方法设置,则返回该值。
状态码尚未设置,则返回基础服务器响应的默认状态码 -
getCookies()方法:(返回一个可变的映射,表示要发送到服务器的Cookie)
返回类型为MultiValueMap<String, ResponseCookie>
,可以包含多个Cookie,以Cookie名称为键 -
addCookie(ResponseCookie cookie)
方法:添加一个ResponseCookie到响应中
响应已经被提交,将会抛出IllegalStateException异常
对应接口的基本使用方式:
- 设置状态码:
ServerHttpResponse response = // 获取ServerHttpResponse的实例
response.setStatusCode(HttpStatus.OK);
- 获取状态码:
ServerHttpResponse response = // 获取ServerHttpResponse的实例
HttpStatus statusCode = response.getStatusCode();
- 添加Cookie:
ServerHttpResponse response = // 获取ServerHttpResponse的实例
ResponseCookie cookie = ResponseCookie.from("cookieName", "cookieValue")
.maxAge(Duration.ofHours(1))
.path("/")
.build();
response.addCookie(cookie);
2. Demo1
该Demo是可以直接执行的测试文件,方便测试接口
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.function.Supplier;
public class test {
public static void main(String[] args) {
testServerHttpResponse();
}
public static void testServerHttpResponse() {
// 创建一个模拟的ServerHttpResponse
ServerHttpResponse serverHttpResponse = new MockServerHttpResponse() {
@Override
public DataBufferFactory bufferFactory() {
return null;
}
@Override
public void beforeCommit(Supplier<? extends Mono<Void>> action) {
}
@Override
public boolean isCommitted() {
return false;
}
};
// 设置状态码
serverHttpResponse.setStatusCode(HttpStatus.OK);
System.out.println("Status Code: " + serverHttpResponse.getStatusCode());
// 添加Cookie
ResponseCookie cookie = ResponseCookie.from("cookieName", "cookieValue")
.maxAge(Duration.ofHours(1))
.path("/")
.build();
serverHttpResponse.addCookie(cookie);
System.out.println("Cookies: " + serverHttpResponse.getCookies());
}
// MockServerHttpResponse类用于模拟ServerHttpResponse
static abstract class MockServerHttpResponse implements ServerHttpResponse {
private HttpStatus statusCode;
private HttpHeaders headers = new HttpHeaders();
private final MultiValueMap<String, ResponseCookie> cookies = new LinkedMultiValueMap<>();
@Override
public boolean setStatusCode(HttpStatus status) {
this.statusCode = status;
return false;
}
@Override
public HttpStatus getStatusCode() {
return this.statusCode;
}
@Override
public HttpHeaders getHeaders() {
return this.headers;
}
@Override
public Mono<Void> writeWith(org.reactivestreams.Publisher<? extends org.springframework.core.io.buffer.DataBuffer> body) {
// 实现写入响应体的逻辑,这里可以留空
return null;
}
@Override
public Mono<Void> writeAndFlushWith(org.reactivestreams.Publisher<? extends org.reactivestreams.Publisher<? extends org.springframework.core.io.buffer.DataBuffer>> body) {
// 实现写入并刷新响应体的逻辑,这里可以留空
return null;
}
@Override
public Mono<Void> setComplete() {
// 实现设置完成的逻辑,这里可以留空
return null;
}
@Override
public MultiValueMap<String, ResponseCookie> getCookies() {
return this.cookies;
}
@Override
public void addCookie(ResponseCookie cookie) {
this.cookies.add(cookie.getName(), cookie);
}
}
}
截图如下:
3. Demo2
对于实际项目,结合Springboot或者SpringCloud使用
类似的Demo如下:
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class MyController {
private final ServerHttpResponse serverHttpResponse;
public MyController(ServerHttpResponse serverHttpResponse) {
this.serverHttpResponse = serverHttpResponse;
}
@GetMapping("/example")
public Mono<String> exampleEndpoint() {
// 在这个方法中可以使用 serverHttpResponse 对象
return Mono.just("Hello World");
}
}
在Spring Webflux中使用ServerRequest获取
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
@Component
public class MyService {
public void handleRequest(ServerWebExchange exchange) {
ServerHttpResponse serverHttpResponse = exchange.getResponse();
// 在这个方法中可以使用 serverHttpResponse 对象
}
}
在Spring MVC中使用HttpServletRequest获取
import org.springframework.http.server.ServletServerHttpResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyService {
public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
ServletServerHttpResponse servletResponse = new ServletServerHttpResponse(response);
// 在这个方法中可以使用 servletResponse 对象
}
}
4. 彩蛋
对于实际应用的项目,给一部分Demo例子(比如登录鉴权)
或者设置401的返回值