详细分析Java中的ServerHttpResponse(附Demo)

前言

对于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);

}

对应各个接口诠释如下:

  1. setStatusCode(HttpStatus status)方法:设置HTTP响应的状态码
    返回true表示成功设置状态码,返回false表示HTTP响应已经被提交,无法设置状态码

  2. getStatusCode()方法:获取HTTP响应的状态码(返回值类型为HttpStatus枚举,可能为null)
    状态码通过setStatusCode()方法设置,则返回该值。
    状态码尚未设置,则返回基础服务器响应的默认状态码

  3. getCookies()方法:(返回一个可变的映射,表示要发送到服务器的Cookie)
    返回类型为MultiValueMap<String, ResponseCookie>,可以包含多个Cookie,以Cookie名称为键

  4. addCookie(ResponseCookie cookie)方法:添加一个ResponseCookie到响应中
    响应已经被提交,将会抛出IllegalStateException异常

对应接口的基本使用方式:

  1. 设置状态码
ServerHttpResponse response = // 获取ServerHttpResponse的实例
response.setStatusCode(HttpStatus.OK);
  1. 获取状态码
ServerHttpResponse response = // 获取ServerHttpResponse的实例
HttpStatus statusCode = response.getStatusCode();
  1. 添加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的返回值

在这里插入图片描述

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值