zoukankan      html  css  js  c++  java
  • feign响应Image流对象

    feign面向方法签名的http调用,越来越受欢迎,类型于rpc的thrift,只需要关注方法签名和返回值即可,当然feign响应流对象时,需要我们做一下特殊处理,否则会出现异常。也有一些文章通过重写HttpMessageConvert来实现,但我测试后发现还是失败的。
    > Accept: image/*会返回406 Not Acceptable

    ### 解决方法
    feign代码,注意返回值必须是`feign.Response`
    ```
      @PostMapping(value = "/wxa/getwxacodeunlimit")
      feign.Response getQrImagePath(@RequestParam("access_token") String accessToken,@RequestBody Map<String, Object> body);

      class WeixinClientFallback implements WeixinClient {
    ```
    restcontroller代码,需要显示声明`produces`类型,这里因为是图片,所以声明为`MediaType.IMAGE_JPEG_VALUE`
    ```
     @GetMapping(value = "/v1/api/sales/qrcode", produces = MediaType.IMAGE_JPEG_VALUE)
      public void qrcode(HttpServletResponse response) {
        //获取token
        Map<String, Object> tokenMap = weixinClient.getToken("client_credential", wxAppId, wxAppSecret);
        if (tokenMap == null) {
          throw Exceptions.paramError("获取token失败");
        }
        if (tokenMap.containsKey("errcode")) {
          throw Exceptions.paramError(MapUtils.getString(tokenMap, "errmsg"));
        }
        String scene = String.format("salesPersonId=%s&agencyId=%s",
            TokenContext.getToken().getUserId(),
            TokenContext.getToken().getCompanyId());
        String token = MapUtils.getString(tokenMap, "access_token");
        Map<String, Object> requestParams = new HashMap<>();
        requestParams.put("scene", scene);
        requestParams.put("page", weixinPage);
        feign.Response imgReponse = weixinClient.getQrImagePath(token, requestParams);
        if (imgReponse == null) {
          throw Exceptions.paramError("获取二维码失败");
        }
        try (InputStream inputStream = imgReponse.body().asInputStream();
             ServletOutputStream outputStream = response.getOutputStream()) {
          response.setContentType("image/png");
          outputStream.write(IOUtils.toByteArray(inputStream));
        } catch (RuntimeException e) {
          throw Exceptions.paramError("获取二维码失败");
        } catch (Exception ex) {
          throw Exceptions.paramError("获取二维码失败");
        }
      }
    ```

  • 相关阅读:
    【0726 | Day 2】编程语言分类/主流编程语言介绍/网络的瓶颈效应
    【0725 | Day 1】计算机编程/计算机组成原理/计算机操作系统
    windows下vue-cli及webpack 构建网站(一)环境安装
    HBuilder 做移动端app流程
    vuejs 学习旅程之 vue-resource
    vuejs 学习旅程一
    身心合一
    td 内容自动换行 table表格td设置宽度后文字太多自动换行
    PhpStorm 2017汉化补丁 2017.1 免费中文版
    PHPStorm2017.1.3永久激活方法之本地破解激活
  • 原文地址:https://www.cnblogs.com/lori/p/11305032.html
Copyright © 2011-2022 走看看