Spring-cloud-openfeign-Main方法调用原生API发送HTTP请求

本文的内容适用于

  1. 公司网络有问题或者同事环境有问题,不能通过@FeignClient注解使用feign的情况
  2. 不喜欢okhttp或者apache client或者java原生io或者其他http工具

步骤

GET请求

  1. 依旧定义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参数就行
  1. main方法直接发送上述get请求
cpp 复制代码
MyFeign feignClient = Feign.builder().target(MyFeign.class, "https://对方域名");
String result = feignClient.getUserDetail("123",new HashMap<>());
System.out.println(result);// 打印对方返回值

POST请求

  1. 定义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参数就行
  1. 定义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);
    }
}
  1. 发送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);// 打印对方返回值
相关推荐
WZTTMoon1 个月前
Spring Boot 启动报错:OpenFeign 隐性循环依赖,排查了整整一下午
java·spring boot·后端·spring cloud·feign
勇敢牛牛_2 个月前
【conreg-client】在Rust中使用向Feign一样的远程调用
网络·rust·feign
知识即是力量ol2 个月前
微服务架构:从入门到进阶完全指南
java·spring cloud·微服务·nacos·架构·gateway·feign
forestsea2 个月前
Webflux声明式http客户端:Spring6原生HttpExchange实现,彻底摒弃feign
spring·feign·响应式声明式客户端
短剑重铸之日3 个月前
《SpringCloud实用版》Feign + LoadBalancer + Sentinel 微服务调用链路
spring cloud·微服务·sentinel·feign·loadbalancer
J_liaty3 个月前
RPC、Feign与OpenFeign技术对比详解
网络·网络协议·rpc·openfeign·feign
没有bug.的程序员6 个月前
Spring Cloud Bus 事件广播机制
java·开发语言·spring boot·hystrix·feign·springcloudbus·事件广播机制
杨DaB6 个月前
【SpringCloud】Ribbon(LoadBalancer ) 和 Feign
spring·spring cloud·ribbon·feign·loadbalance
linweidong6 个月前
理想汽车Java后台开发面试题及参考答案(下)
jvm·spring boot·spring cloud·rpc·虚拟机·feign·二叉树排序