Spring 使用 feign时设置header信息的操作

 更新时间:2021年08月04日 08:38:17   作者:糊涂小农  
这篇文章主要介绍了Spring 使用 feign时设置header信息的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring feign时设置header信息

最近使用 SpringBoot 项目,把一些 http 请求转为 使用 feign方式。但是遇到一个问题:个别请求是要设置header的。

于是,查看官方文档和博客,大致推荐两种方式。也可能是我没看明白官方文档。

接口如下:

@FeignClient(url ="XX_url", value ="XXService")
public interface XXService {
 
    @RequestMapping(value ="/xx", method = RequestMethod.POST)
    @Headers({"Content-Type: application/json","Accept: application/json"})
    String sendDing(String params);
}

1. 使用Headers注解。直接在请求上或者在类上添加

这种方式经过尝试,没有作用。暂时不清楚原因。

2. 通过实现RequestInterceptor接口,完成对所有的Feign请求,设置Header

@Component
public class FeginClientConfig {
    @Bean
    public RequestInterceptor headerInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                    // 小示例,没什么卵用
                    requestTemplate.header("Content-Type","application/json");
            }
        };
    }
 
    @Bean
    public Logger.Level level() {
        return Logger.Level.FULL;
    } 
}

这种方式,是针对所有feign请求进行拦截,设置Header,不适于我的需求。

后来发现其实我的思路走偏了。咨询了一个同事,既然使用的是RequestMapping注解。那么直接使用RequestMapping注解的header属性就可以了。如下:

@RequestMapping(value ="/xx", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})

有一点需要注意:content-type=application/x-www-form-urlencoded。此时,方法里接收的参数,就不能直接是一个对象(Map等)。不然还是会默认

content-type为 application/json.

@RequestMapping(value ="/xx", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
String login(@RequestParam("username") String username,@RequestParam("password") String password;

Feign动态设置Header

Feign调用接口:

/**
 * @author Liangzhifeng
 * date: 2018/9/13
 */
public interface UserInfoFeignClient {

    /**
     * 根据token获取用户信息
     * @param token
     * @return
     */
    @RequestMapping(value = "/user/info/1.0", method = RequestMethod.POST)
    Object getUserInfoByToken(@RequestParam("token") String token);
}

/**
 * @author Liangzhifeng
 * date: 2018/9/15
 */
@Component
public class AuthorityConfig {

    /**
     * 授权信息Header的key
     */
    public static final String OAUTH_KEY = "token";

    /**
     * 授权信息Header的值的前缀
     */
    public static final String OAUTH_VALUE_PREFIX = "Bearer ";

	// GlobalConstant.AUTHORITY_SERVICE_LINK  : 服务的名称

    @Autowired
    private Client client;

    public UserInfoFeignClient userInfoFeignClient(String token) {
        UserInfoFeignClient authorityServiceLoginInvoker = Feign.builder().client(client)
                .encoder(new GsonEncoder())
                .decoder(new GsonDecoder())
                .contract(new SpringMvcContract())
                .requestInterceptor(template -> template.header(OAUTH_KEY, OAUTH_VALUE_PREFIX + token))
                .target(UserInfoFeignClient.class, GlobalConstant.AUTHORITY_SERVICE_LINK);
        return authorityServiceLoginInvoker;
    }
}

接口调用:

@Autowired
private AuthorityConfig authorityConfig;

/**
 * 根据token获取用户信息
 *
 * @param token 用户登录的授权token
 * @return 用户信息JSON
 */
public Object getUserInfo(String token) {
    try {
        Object userInfo = authorityConfig.userInfoFeignClient(token).getUserInfoByToken(token);
        return userInfo;
    } catch (Exception e) {
        log.info("获取用户信息异常", e);
        return null;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何优雅的抛出Spring Boot注解的异常详解

    如何优雅的抛出Spring Boot注解的异常详解

    这篇文章主要给大家介绍了关于如何优雅的抛出Spring Boot注解的异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 实战指南:Java编写Flink SQL解决难题

    实战指南:Java编写Flink SQL解决难题

    想知道如何利用Java编写Flink SQL解决难题吗?本指南将为您揭示最实用的技巧和策略,让您轻松应对挑战,跟着我们一起探索,让Java和Flink SQL成为您问题解决的得力助手!
    2023-12-12
  • Java修饰符 abstract,static,final 的区别详解

    Java修饰符 abstract,static,final 的区别详解

    以下是对Java修饰符abstract,static,final的区别进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • idea中创建多module的maven工程的方法

    idea中创建多module的maven工程的方法

    这篇文章主要介绍了idea中创建多module的maven工程的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Redis六大数据类型使用方法详解

    Redis六大数据类型使用方法详解

    这篇文章主要介绍了Redis六大数据类型使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Springboot集成jdbcTemplate过程解析

    Springboot集成jdbcTemplate过程解析

    这篇文章主要介绍了Springboot集成jdbcTemplate过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring中一个少见的引介增强IntroductionAdvisor

    Spring中一个少见的引介增强IntroductionAdvisor

    这篇文章主要为大家介绍了Spring中一个少见的引介增强IntroductionAdvisor实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • JAVA多线程知识汇总

    JAVA多线程知识汇总

    这篇文章主要介绍了JAVA多线程的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • IDEA 控制台中文乱码4种解决方案

    IDEA 控制台中文乱码4种解决方案

    IntelliJ IDEA 如果不进行相关设置,可能会导致控制台中文乱码、配置文件中文乱码等问题,本文主要介绍了IDEA控制台中文乱码4种解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 浅谈Spring Boot 属性配置和自定义属性配置

    浅谈Spring Boot 属性配置和自定义属性配置

    这篇文章主要介绍了浅谈Spring Boot 属性配置和自定义属性配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论