本文的内容适用于
- 公司网络有问题或者同事环境有问题,不能通过
@FeignClient注解使用feign的情况 - 不喜欢okhttp或者apache client或者java原生io或者其他http工具
步骤
- GET请求
- POST请求
GET请求
- 依旧定义feign接口,但是并没有使用
@FeignClient注解
importfeign.Body;importfeign.HeaderMap;importfeign.Param;importfeign.RequestLine;importjava.util.Map;publicinterface MyFeign{// 根据人员id查询人员详情@RequestLine("GET /user/detail?id={userId}")StringgetUserDetail(@Param("userId")String userId,@HeaderMap Map<String,String>headers);}@RequestLine:feign固定写法 GET:feign固定写法,表示发送GET请求 /user/detail:我要调用的接口路径(servlet path) {userId}:双侧大括号为feign约定写法,表示大括号内的词,一定在方法入参中存在,feign会从方法入参中取该值,然后替换掉{userId} @Param("userId"):feign约定写法,同上,一定是和双侧大括号一一对应的 @HeaderMap:Http请求头,如果不需要删掉headers参数就行- main方法直接发送上述get请求
MyFeign feignClient=Feign.builder().target(MyFeign.class,"https://对方域名");String result=feignClient.getUserDetail("123",newHashMap<>());System.out.println(result);// 打印对方返回值POST请求
- 定义feign接口,但是并没有使用
@FeignClient注解
publicinterface MyFeign{// 根据人员id查询人员详情@RequestLine("POST /user/detail")@Body("{body}")StringgetUserDetail(@Param(value="body",expander=MediaTypeByJsonExpander.class)User user,@HeaderMap Map<String,String>headers);}@RequestLine:feign固定写法 POST:feign固定写法,表示发送POST请求 /user/detail:我要调用的接口路径(servlet path) @Body("{body}") 双侧大括号为feign约定写法,表示大括号内的词,一定在方法入参中存在,feign会从方法入参中取该值,然后替换掉{body} value = "body":表示将user赋值到{body}中,但是怎么赋值,由expander决定 expander = MediaTypeByJsonExpander.class:因为http请求body不能是对象,所以expander就是用来处理如何将user对象转换成字符串,后文有介绍 @HeaderMap:Http请求头,如果不需要删掉headers参数就行- 定义expander
importcom.alibaba.fastjson.JSON;importfeign.Param;publicclassMediaTypeByJsonExpanderimplements Param.Expander{// 媒体类型为application/json的post请求现在最常用,// 所以这里假设只处理json数据,value是上述接口// getUserDetail的user入参,这里相当于把user转换成json字符串@OverridepublicStringexpand(Object value){returnJSON.toJSONString(value);}}- 发送POST请求(同GET请求)
MyFeign feignClient=Feign.builder().target(MyFeign.class,"https://对方域名");User user=newUser();user.setId("123");String result=feignClient.getUserDetail(user,newHashMap<>());System.out.println(result);// 打印对方返回值