feign传参方式详解
1.案例准备
1.1 新建fegin_interface子工程模块
UserFeign接口
@FeignClient("feign-provider")//代理类
@RequestMapping("/provider")
public interface UserFeign {
}
1.2 新建feigin_consumer
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>cloud.funcode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>feign_consumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cloud.funcode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>cloud.funcode</groupId>
<artifactId>feign_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.159.129:8848
application:
name: feign-consumer
控制层Service
@RestController
@RequestMapping("/consumer")
public class TestController {
@Autowired
private UserFeign userFeign;
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启feign
public class FeignConsumerApp {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApp.class, args);
}
}
1.3. 创建feign_provider
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>cloud.funcode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>feign_provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cloud.funcode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.159.129:8848 #nacos虚拟机地址+端口号
application:
name: feign-provider #和工程名保持一致
业务层接口service及其实现类serviceImpl
public interface TestService {
}
@Service
public class TestServiceImpl implements TestService {
}
控制层Controller
@RestController
@RequestMapping("/provider")
public class TestController {
@Autowired
private TestService service;
}
启动类
@SpringBootApplication
@EnableDiscoveryClient//开启nacos的功能:注册自己并发现其他服务
public class FeignProviderApp {
public static void main(String[] args) {
SpringApplication.run(FeignProviderApp.class, args);
}
}
2. 三种传参方式
2.1. restful风格路径传参
UserFeign
/**
* restful风格路径传参
*/
@GetMapping("/getUserByName/{name}")
public User getUserByName(@PathVariable("name") String name);
ConsumerController
@GetMapping("/getUserByName/{name}")
public User getUserByName(@PathVariable String name) {
return userFeign.getUserByName(name);
}
TestController
@GetMapping("/getUserByName/{name}")
public User getUserByName(@PathVariable("name") String name){
return service.getUserByName(id);
}
service&serviceimpl
User getUserByName(String name);
@Override
public User getUserByName(String name) {
User user = new User();
user.setId(110);
user.setName(name);
user.setAge(18);
return user;
}
浏览器地址栏输入http://127.0.0.1/consumer/getUserByName/范特西
运行结果:
2.2. 路径拼接传参
UserFeign
/**
* restful风格路径传参
*/
@GetMapping("/getUserByAge")
public User getUserByAge(@PathVariable("age") Integer age);
ConsumerController
@GetMapping("/getUserByAge")
public User getUserByName(@PathVariable Integer age) {
return userFeign.getUserByAge(age);
}
TestController
@GetMapping("/getUserByAge")
public User getUserByAge(@PathVariable("age") Integer age){
return service.getUserByAge(age);
}
service&serviceimpl
User getUserByAge(Integer age);
@Override
public User getUserByAge(Integer age) {
User user = new User();
user.setId(110);
user.setName("范特西");
user.setAge(age);
return user;
}
浏览器地址栏输入http://127.0.0.1/consumer/getUserByAge?age=100
运行结果:
2.3. 请求体传参-对象
UserFeign
/**
* restful风格路径传参
*/
@RequestMapping("/addUser")
public User addUser(@PathVariable("age") User user);
ConsumerController
@RequestMapping("/addUser")
public User addUser(@PathVariable User user) {
return userFeign.addUser(user);
}
TestController
@RequestMapping("/addUser")
public User getUserByAge(@PathVariable("age") User user){
return service.addUser(user);
}
service&serviceimpl
User addUser(Integer user);
@Override
public User addUser(User user) {
return user;
}
浏览器地址栏输入http://127.0.0.1/consumer/addUser?id=110&name=%E7%91%B6%E7%91%B6&age=20
运行结果:
2.3. 请求体传参-数组
UserFeign
/**
* restful风格路径传参
*/
@RequestMapping("/delUserById")
public Integer[] delUserById(@RequestParam("ids") Integer[] ids);
ConsumerController
@RequestMapping("/delUserById")
public Integer[] addUser(@RequestParam("ids") Integer[] ids) {
return userFeign.delUserById(ids);
}
TestController
@RequestMapping("/delUserById")
public Integer[] delUserById(@RequestParam("ids") Integer[] ids){
return service.delUserById(ids);
}
service&serviceimpl
Integer[] delUserById(Integer[] ids);
@Override
public Integer[] delUserById(Integer[] ids) {
return ids;
}
浏览器地址栏输入http://127.0.0.1/consumer/addUser?id=110&name=%E7%91%B6%E7%91%B6&age=20
运行结果:
2.4. 请求体传参-集合
UserFeign
/**
* restful风格路径传参
*/
@RequestMapping("/addListUser")
public List<User> addListUser(@RequestBody List<User> userList);
ConsumerController
@RequestMapping("/addListUser")
public List<User> addListUser(){
List<User> list = new ArrayList<>();
list.add(new User(100,"范特西",25));
list.add(new User(101,"瑶瑶",25));
list.add(new User(102,"张三",25));
list.add(new User(103,"里斯",25));
return userFeign.addListUser(list);
}
TestController
@RequestMapping("/addListUser")
public List<User> addListUser(@RequestBody List<User> userList){
return service.addListUser(userList);
}
service&serviceimpl
List<User> addListUser(List<User> userList);
@Override
public List<User> addListUser(List<User> userList) {
return userList;
}
浏览器地址栏输入http://127.0.0.1/consumer/addListUser
运行结果: