Fegin调用之间传递Response流的弊端

一次项目中调用API的时候没有留意,没有发现API返回的是Response流,作为中间API接口封装的服务,直接将外部返回回来的流传递给了消费者服务,导致出了问题.

后来在网上找到了原因:feign Response只能读一次问题 和 feign response 返回值拦截_社区之星的专栏-CSDN博客_feign response

所以我在我的代码里进行了一层封装Demo如下:


  public void getMedia(String corpId,
                       String media_id,
                       HttpServletResponse response){

    Response re = null;
    InputStream is = null;
    BufferedOutputStream bufferedOutputStream = null;

    try{
      // 这里就是通过fegin得到的response流
      re = qyWechatApiMaterialService.getMedia(corpId, media_id);
  
      is = re.body().asInputStream();

      response.setHeader(HttpHeaders.CONTENT_LENGTH, ((LinkedList<String>) re.headers().get("content-length")).get(0));
 

      response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"" + getName(((LinkedList<String>) re.headers().get("content-disposition")).get(0)) + "\"");
   

      response.setHeader(HttpHeaders.CONTENT_TYPE, ((LinkedList<String>)re.headers().get("content-type")).get(0));

      // 转换成缓冲流
      bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());

      int length = 0;
      byte[] temp = new byte[1024 * 10];
      while ((length = is.read(temp)) != -1) {
        
        bufferedOutputStream.write(temp, 0, length);
      }

      bufferedOutputStream.flush();
    }catch (IOException io){
      log.error(io.getMessage());
    }finally {
      try {
        if(bufferedOutputStream != null){
          bufferedOutputStream.close();
        }
        if(is != null){
          is.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

最后问题被完美解决


版权声明:本文为qq_40708942原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。