栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Feign请求接口返回一直是null

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Feign请求接口返回一直是null

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;


@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;
    }

    
    private HttpMessageConverters feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter());
        return httpMessageConverters;
    }

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

        List 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()方法,记得标明编码格式,否则会报错

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/329093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号