Spring Cloud中远程调用时-OpenFeign如何传递参数呢?

欣喜 SpringBoot 发布时间:2025-03-19 16:38:10 阅读数:4155 1
下文笔者讲述SpringCloud中OpenFeign调用时,
传递参数的方法分享
例:
  路径参数、查询参数、请求头参数和请求体参数

1.传递路径参数

路径参数是 URL 路径中的一部分
  使用 `@PathVariable` 注解来传递路径参数。
假设有一个远程服务 `UserService`

其接口如下:
 
// UserService.java
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);


在 OpenFeign 客户端中传递路径参数:
 
// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}
 
使用示例
 
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public User fetchUser(Long id) {
    return userServiceClient.getUserById(id);
}
 

2.传递查询参数

查询参数是URL 中
 `?key=value` 部分
 使用 `@RequestParam` 注解来传递查询参数
假设有一个远程服务 `UserService`
其接口如下:

// UserService.java
@GetMapping("/users")
list<User> getUsersByAge(@RequestParam("age") int age);

在 OpenFeign 客户端中传递查询参数:
// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users")
    List<User> getUsersByAge(@RequestParam("age") int age);
}

使用示例

//UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public List<User> fetchUsersByAge(int age) {
    return userServiceClient.getUsersByAge(age);
}

3.传递请求头参数

请求头参数是HTTP请求头中的信息
  使用 `@RequestHeader` 注解来传递请求头参数
假设有一个远程服务 `UserService`
其接口如下

// UserService.java
@GetMapping("/users")
List<User> getUsersByToken(@RequestHeader("Authorization") String token);

在 OpenFeign 客户端中传递请求头参数
// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users")
    List<User> getUsersByToken(@RequestHeader("Authorization") String token);
}

使用示例
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public List<User> fetchUsersByToken(String token) {
    return userServiceClient.getUsersByToken(token);
}

4.传递请求体参数

请求体参数通常用于 `POST` 或 `PUT` 请求
使用`@RequestBody`注解来传递请求体参数
假设有一个远程服务`UserService`
其接口如下

// UserService.java
@PostMapping("/users")
User createUser(@RequestBody User user);

在 OpenFeign 客户端中传递请求体参数:

// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @PostMapping("/users")
    User createUser(@RequestBody User user);
}

使用示例
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public User createUser(User user) {
    return userServiceClient.createUser(user);
}

5.传递多个参数

在某些情况下
 您可能需要传递多个参数
  包括路径参数、查询参数和请求头参数
假设有一个远程服务 `UserService`
 其接口如下:
 
// UserService.java
@GetMapping("/users/{id}")
User getUserByIdAndToken(@PathVariable("id") Long id, @RequestHeader("Authorization") String token);
 
在 OpenFeign 客户端中传递多个参数:
 
// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users/{id}")
    User getUserByIdAndToken(@PathVariable("id") Long id, @RequestHeader("Authorization") String token);
} 

使用示例
 
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public User fetchUser(Long id, String token) {
    return userServiceClient.getUserByIdAndToken(id, token);
}

6.传递复杂对象

如果需要传递复杂的对象作为查询参数
  可以使用 `@RequestParam` 注解
   并结合 `@SpringQueryMap` 注解(需要引入`feign-form`依赖)
添加依赖

在 `pom.xml` 中添加 `feign-form` 依赖:
 
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.8.0</version>
</dependency>
 
例

假设有一个远程服务 `UserService`,其接口如下:
 
// UserService.java
@GetMapping("/users")
List<User> getUsersByParams(@RequestParam Map<String, Object> params);
 
在 OpenFeign 客户端中传递复杂对象:
 
// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users")
    List<User> getUsersByParams(@SpringQueryMap Map<String, Object> params);
}
 
使用示例 
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public List<User> fetchUsersByParams(Map<String, Object> params) {
    return userServiceClient.getUsersByParams(params);
}

7.传递表单数据

如果需要传递表单数据
 可使用 `@FormParam` 注解(需要引入 `feign-form` 依赖)。
添加依赖

在 `pom.xml` 中添加 `feign-form` 依赖(如果尚未添加):

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.8.0</version>
</dependency>

例

假设有一个远程服务 `UserService`,其接口如下:

// UserService.java
@PostMapping("/users")
User createUser(@FormParam("name") String name, @FormParam("age") int age);

在 OpenFeign 客户端中传递表单数据:

// UserServiceClient.java
@FeignClient(name = "userService", configuration = FormEncoderConfiguration.class)
public interface UserServiceClient {

    @PostMapping(value = "/users", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    User createUser(@FormParam("name") String name, @FormParam("age") int age);
}

// FormEncoderConfiguration.java
@Configuration
public class FormEncoderConfiguration {

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder();
    }
}

使用示例
// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public User createUser(String name, int age) {
    return userServiceClient.createUser(name, age);
}

8.传递路径参数和查询参数

在同一个请求中传递路径参数和查询参数。

例

假设有一个远程服务 `UserService`
其接口如下:

// UserService.java
@GetMapping("/users/{id}")
User getUserByIdAndAge(@PathVariable("id") Long id, @RequestParam("age") int age);

在 OpenFeign 客户端中传递路径参数和查询参数:

// UserServiceClient.java
@FeignClient(name = "userService")
public interface UserServiceClient {

    @GetMapping("/users/{id}")
    User getUserByIdAndAge(@PathVariable("id") Long id, @RequestParam("age") int age);
}

使用示例

// UserServiceClient 使用示例
@Autowired
private UserServiceClient userServiceClient;

public User fetchUser(Long id, int age) {
    return userServiceClient.getUserByIdAndAge(id, age);
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202503/8380.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者