springcloud:3种办法解决feign调用参数为实体类的GET接口

0.引言

最近在讲解关于feign的组间调用,遇到了调用参数为实体类的GET请求报错或者参数获取为空问题,于是统一记录解决办法,方便大家后续参考

1. 原因

首先我们要知道,关于实体类参数,feign默认是支持post请求的。直接调用GET型的实体类参数接口会产生405报错或参数为空,如下所示

GET接口:

    @GetMapping("getByBody2")
    public String getByBody2(Product product){
        return "product:" + JSON.toJSONString(product);
    }

feign调用代码:

@GetMapping("getByBody2")
String getByBody2(Product product

报错内容:
在这里插入图片描述

这是因为feign本身就不支持这种形式的调用,他推荐的是转换为POST接口,但是有时,我们无法修改原接口,一定要求这种调用时,也不得不去解决,所以我们来看以下三种解决之法

2. 解决

方法1:参数转map

首先我们无法调用是因为不支持实体类参数,那么转换为键值对参数就可以实现调用了

参数转换:

@GetMapping("getBody2")
    public String getBody2(){
        Product product = new Product();
        product.setId(1L);
        product.setName("苹果");
        product.setPrice(new BigDecimal("123.3"));
        product.setQuantity(2);
        // 实体类转json字符串 需要引入fastjson依赖
        String jsonString = JSON.toJSONString(product);
        // json字符串转map
        Map params = JSON.parseObject(jsonString, Map.class);
        return "order info " + productFeignNacos.getByBody2(params);
    }

feign接口声明:
注意这种形式,需要添加@RequestParam注解,并命名与被调用接口参数名一致

@GetMapping("getByBody2")
String getByBody2(@RequestParam("product") Map product);

被调用接口:

    @GetMapping("getByBody2")
    public String getByBody2(Product product){
        return "product:" + JSON.toJSONString(product);
    }

方法2:利用@SpringQueryMap注解自动转map

@SpringQueryMap注解可以将实体类自动转换为map,那么我们就不需要手动转换成map了

feign接口声明

@GetMapping("getByBody2")
String getByBody3(@SpringQueryMap Product product);

方法3:利用feign-httpclient工具包

feign-httpclient工具包提供了支持GET实体参数的实现,我们只需要引入这个依赖即可

<dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>10.10.1</version>
</dependency>

调用方代码:

    @GetMapping("getBody4")
    public String getBody4(){
        Product product = new Product();
        product.setId(1L);
        product.setName("苹果");
        product.setPrice(new BigDecimal("123.3"));
        product.setQuantity(2);
        return "order info " + productFeignNacos.getByBody4(product);
    }

feign接口声明:

@GetMapping(value = "")
String getByBody4(Product product);

被调用接口:

   @GetMapping(value = "getByBody3", consumes = MediaType.APPLICATION_JSON_VALUE)
    public String getByBody3(@RequestBody Product product){
        return "product:" + JSON.toJSONString(product);
    }

调用结果展示

在这里插入图片描述

总结

如上,三种方式,任君挑选

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud微服务架构中,Nacos是一个注册中心和配置中心。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。 使用Feign调用接口需要以下步骤: 1. 在pom.xml中添加Feign依赖 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 在启动类上添加@EnableFeignClients注解启用Feign客户端 ```java @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 3. 创建接口,并使用@FeignClient注解指定调用的服务名称和服务路径 ```java @FeignClient(name = "service-provider") public interface UserService { @GetMapping("/user/{id}") String getUserById(@PathVariable("id") Long id); } ``` 其中,name属性指定服务名称,GetMapping注解指定服务路径。 4. 在需要使用该服务的地方注入UserService并调用方法即可 ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{id}") public String getUserById(@PathVariable("id") Long id) { return userService.getUserById(id); } } ``` 在这个例子中,我们定义了一个名为UserService的Feign客户端,指定了调用的服务名称和服务路径。然后在UserController中注入了UserService并调用了其方法。最终,Feign会自动将该请求转发到名为service-provider的微服务,并返回结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wu@55555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值