本文的内容适用于
- 公司网络有问题或者同事环境有问题,不能通过
@FeignClient注解使用feign的情况 - 不喜欢okhttp或者apache client或者java原生io或者其他http工具
步骤
GET请求
- 依旧定义feign接口,但是并没有使用
@FeignClient注解
cpp
import feign.Body;
import feign.HeaderMap;
import feign.Param;
import feign.RequestLine;
import java.util.Map;
public interface MyFeign{
// 根据人员id查询人员详情
@RequestLine("GET /user/detail?id={userId}")
String getUserDetail(@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请求
cpp
MyFeign feignClient = Feign.builder().target(MyFeign.class, "https://对方域名");
String result = feignClient.getUserDetail("123",new HashMap<>());
System.out.println(result);// 打印对方返回值
POST请求
- 定义feign接口,但是并没有使用
@FeignClient注解
cpp
public interface MyFeign{
// 根据人员id查询人员详情
@RequestLine("POST /user/detail")
@Body("{body}")
String getUserDetail(@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
cpp
import com.alibaba.fastjson.JSON;
import feign.Param;
public class MediaTypeByJsonExpander implements Param.Expander {
// 媒体类型为application/json的post请求现在最常用,
// 所以这里假设只处理json数据,value是上述接口
// getUserDetail的user入参,这里相当于把user转换成json字符串
@Override
public String expand(Object value) {
return JSON.toJSONString(value);
}
}
- 发送POST请求(同GET请求)
cpp
2. main方法直接发送上述get请求
```cpp
MyFeign feignClient = Feign.builder().target(MyFeign.class, "https://对方域名");
User user=new User();
user.setId("123");
String result = feignClient.getUserDetail(user,new HashMap<>());
System.out.println(result);// 打印对方返回值