Skip to content

SpringCloud OpenFeign 流式响应文件

#流式传输#分块传输#Feign#OpenFeign

@FeignClient代码

java
import cn.hutool.json.JSONObject;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(name = "documentConver", url = "http://127.0.0.1:15676")
public interface DocumentConverClient {


    @PostMapping("/html2pdf/url")
    Response html2pdfUrl(@RequestBody JSONObject jsonObject);
}

Controller转化Feign流式响应文件

java
package com.ruoyi.web.controller.oa;

import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.rpc.htm2pdf.DocumentConverClient;
import feign.Response;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
@Slf4j
public class TestController {

    private final DocumentConverClient documentConverClient;


    @GetMapping("/url_to_pdf")
    public void urlToPdf(String url, HttpServletResponse response) {
        String decodeUrl = "";
        try {
            decodeUrl = Base64.decodeStr(url, StandardCharsets.UTF_8);

            // 获取Feign响应对象
            try (Response feignResponse = documentConverClient.htmlUrl2Pdf(JSONUtil.createObj().set("url","https://www.baidu.com"))) {

                // 检查响应状态
                if (feignResponse.status() != 200) {
                    throw new RuntimeException("PDF服务返回错误状态: " + feignResponse.status());
                }

                // 可选:复制原始响应头
                feignResponse.headers().forEach((key, values) -> {
                    if (key != null && values != null && !key.equalsIgnoreCase("Transfer-Encoding")) {
                        values.forEach(value -> response.addHeader(key, value));
                    }
                });

                // 设置响应头
                response.setContentType("application/pdf");
                response.setCharacterEncoding("UTF-8");

                // 流式传输
                try (InputStream inputStream = feignResponse.body().asInputStream();
                     OutputStream outputStream = response.getOutputStream()) {
                    
                    byte[] buffer = new byte[8192];
                    int bytesRead;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                }
            }
        } catch (Exception e) {
            log.error("查看pdf失败 url={} decodeUrl={}", url, decodeUrl, e);
            throw new RuntimeException("查看pdf失败: " + e.getMessage());
        }
    }
}
/src/technology/dateblog/2025/07/20250701-springcloud-openfeign-%E6%B5%81%E5%BC%8F%E5%93%8D%E5%BA%94%E6%96%87%E4%BB%B6.html