Feign请求接口返回一直是null
问题来源
通过Feign去访问一个接口,使用Object
接收返回值,每次都是null
问题定位
返回值的编码问题
通过浏览器访问接口,可以看到接口返回的数据的charset
是GBK
,所以第一步要保证Feign的解析器是使用的fastjson
使其可以解析这种数据。具体配置可以参照https://blog.csdn.net/weixin_43080383/article/details/120681105
尝试使用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
来接收数据,发现可以得到相应的数据。
为feign的调用开启日志
feign的日志分为四个级别:
添加Bean
配置来更改级别,默认是NONE
级别
@Bean
Logger.Level feignLevel() {
return Logger.Level.FULL;
}
随后还要开启项目的debug
级别的日志
feign的接收数据格式
在feign
包下有一个Response
类,我们可以使用这个类来接收接口的返回数据
关于返回数据是二进制流的处理
使用Response
来接收数据之后,发现每次请求其实是得到了数据的
但是发现body
中是Binary data
,现在的问题就是如何处理这个二进制流的数据
我们使用guava
来处理这种数据,有文档做过比较,这种方式的效率较高
- 首先引入
guava
-
使用其中的
CharStreams.toString()
方法,记得标明编码格式,否则会报错
就这样终于获得了想要的数据