Feign请求接口返回一直是null

问题来源

通过Feign去访问一个接口,使用Object接收返回值,每次都是null

问题定位

返回值的编码问题

image-20211014221533612

通过浏览器访问接口,可以看到接口返回的数据的charsetGBK,所以第一步要保证Feign的解析器是使用的fastjson使其可以解析这种数据。具体配置可以参照https://blog.csdn.net/weixin_43080383/article/details/120681105

image-20211014221718471

尝试使用RestTamplate直接调用接口

也需要配置解析器,否则还是会无法解析

package com.yinrj.springdemo.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.alibaba.fastjson.support.springfox.SwaggerJsonSerializer;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * @author yinrongjie
 * @version 1.0
 * @date 2021/10/14
 * @description
 */
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate= new RestTemplate(factory);
        // 支持中文编码
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        restTemplate.getMessageConverters().add(getFastJsonConverter());
        return restTemplate;

    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }

    /**
     * 设置解码器为fastjson
     *
     * @return
     */
    private HttpMessageConverters feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter());
        return httpMessageConverters;
    }

    private FastJsonHttpMessageConverter getFastJsonConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();

        List<MediaType> supportedMediaTypes = new ArrayList<>();
        MediaType mediaTypeJson = MediaType.valueOf(MediaType.ALL_VALUE);
        supportedMediaTypes.add(mediaTypeJson);
        converter.setSupportedMediaTypes(supportedMediaTypes);
        FastJsonConfig config = new FastJsonConfig();
        config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer());
        config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
        converter.setFastJsonConfig(config);

        return converter;
    }

}

使用ResponseEntity来接收数据,发现可以得到相应的数据。

image-20211014222218139

为feign的调用开启日志

feign的日志分为四个级别:

image-20211014222352078

添加Bean配置来更改级别,默认是NONE级别

@Bean
    Logger.Level feignLevel() {
        return Logger.Level.FULL;
    }

随后还要开启项目的debug级别的日志

image-20211014222524981

feign的接收数据格式

feign包下有一个Response类,我们可以使用这个类来接收接口的返回数据

image-20211014222716967

关于返回数据是二进制流的处理

使用Response来接收数据之后,发现每次请求其实是得到了数据的

image-20211014222911502

但是发现body中是Binary data,现在的问题就是如何处理这个二进制流的数据

我们使用guava来处理这种数据,有文档做过比较,这种方式的效率较高

  • 首先引入guava

image-20211014223058557

  • 使用其中的CharStreams.toString()方法,记得标明编码格式,否则会报错

    image-20211014223145499

就这样终于获得了想要的数据

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐