Spring Boot 2.x实战55 - Spring Web MVC 27 - 异步请求(HTTP Streaming - StreamingResponseBody)

我们可以通过返回StreamingResponseBody来直接使用返回的OutputStream来自己控制数据返回。我们也可以使用ResponseEntity来定制状态和头的信息。

本例使用StreamingResponseBody返回一张图片,示例控制器如下:

@RestController
@RequestMapping("/async")
@Slf4j
public class AsyncController {
    @Value("classpath:wyn.jpg") //1
    private Resource image;

    @GetMapping("/img")
    public ResponseEntity<StreamingResponseBody> streamingResponseBody() {
       return ResponseEntity.ok()
               .contentType(MediaType.IMAGE_JPEG) //2
               .body(outputStream -> { //3
                   IOUtils.copy(image.getInputStream(), outputStream); //4
               });
    }
  
    @GetMapping("/sync-img") //5
    public ResponseEntity<Resource>  syncImage() {
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(image);
    }

}
  1. 拷贝图片到src/main/resouces下,可以用@Value注解读取图片到Resource对象中;
  2. 使用ResponseEntity指定头信息的内容类型为图片;
  3. StreamingResponseBody是一个函数接口,接口内的唯一方法为void writeTo(OutputStream outputStream),我们使用Lambda表达式即可操作OutputStream对象;
  4. 使用org.apache.tomcat.util.http.fileupload.IOUtilsResouce中的InputStream复制到OutputStream中。
  5. 此控制器用来同步返回图片,用作对比。

我们访问https://localhost:8443/async/img和https://localhost:8443/async/sync-img。同步情况是阻碍式的已经知道数据的大小和类型,而异步的情况下是未知的。
Spring Boot 2.x实战55 - Spring Web MVC 27 - 异步请求(HTTP Streaming - StreamingResponseBody)_第1张图片
上图左侧是异步的,右侧是同步的。

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html

在这里插入图片描述
主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

你可能感兴趣的:(Spring,Boot2.x实战,-,Spring,MVC,Spring,Boot2.x实战全集)