Feign基本使用
Feign基本用法——GET请求
现在假设我们有A、B两个服务,B服务中暴露了一个登录的API接口,接口请求方式为GET,结构如下:
@ApiOperation(value = "用户登录",notes = "用户登录")
@GetMapping("/login")
public ResultBody login(@RequestParam(value = "username",required = true) String username,
@RequestParam(value = "password",required = true) String password){
业务代码。。。。。
return ResultBody.ok();
}
现在我们在A服务中使用Feign远程调用该接口,首先创建一个用于远程调用接口的.java文件,并在其中新建一个方法来调用。
@FeignClient(value = BaseConstants.B_SERVICE)
public interface BRemoteService {
@GetMapping("/login")
ResultBody login(@RequestParam(value = "username",required = true) String username,
@RequestParam(value = "password",required = true) String password);
}
接下来,我们在A服务中模拟调用B服务的login接口。假设在A服务中有一个UserController类,其中有一个userLogin接口,我们在该接口中远程调用B服务中的login接口。
@Api(tags = "用户Api")
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private BRemoteService bRemoteService;
@ApiOperation(value = "用户登录",notes = "用户登录")
@GetMapping("/login")
public ResultBody login(@RequestParam(value = "username",required = true) String username,
@RequestParam(value = "password",required = true) String password){
return bRemoteService.login(username,password);
}
}
这样,当我们访问A服务的user/login接口时,就会调用B服务的login接口。当然,前提是你没有写错,并且你的服务的启动类上加上了@EnableFeignClients注解。
Feign基本用法——POST请求
POST请求常用的传参类型为json和表单两种形式,下面就两种情况分别说明。
application/json
现在假设B服务暴露了一个用户注册的API接口,A服务来进行调用,接口结构如下:
@ApiOperation(value = "用户注册",notes = "用户注册")
@PostMapping("/register")
public ResultBody register(@RequestBody User user){
业务代码。。。。。
return ResultBody.ok();
}
这时候只需要在A服务中的BRemoteService.java接口文件中新增一个远程调用的接口即可,如下:
@PostMapping("/register")
ResultBody register(@RequestBody User user);
接着在A服务中的UserController里进行调用。代码如下:
@ApiOperation(value = "用户注册",notes = "用户注册")
@PostMapping("/register")
public ResultBody register(@RequestBody User user){
returnbRemoteService.register(user);
}
application/x-www-form-urlencoded
现在假设我们B服务的用户注册接口为如下结构:
@ApiOperation(value = "用户注册",notes = "用户注册")
@PostMapping("/register")
public ResultBody register(User user){
业务代码。。。。。
return ResultBody.ok();
}
可以看到,这里与上面的结构相比少了一个@RequestBody注解,这代表着现在的接口接收的是以表单形式(application/x-www-form-urlencoded)传递的参数,此时若我们在A服务中的BRemoteService.java接口文件进行如下调用的话,会发现,服务确实调用了,但是参数却没有传过去。
@PostMapping("/register")
ResultBody register(User user);
这是因为Feign进行远程调用时,必须指定传参的格式,那我们能不能改成下面这样呢?
@PostMapping("/register")
ResultBody register(@RequestParam User user);
很显然,当你写成这种格式的时候,你的服务根本就无法进行远程调用,因为你的服务都无法运行起来。
正确的写法应该是下面这种:
@PostMapping(value = "/register",consumes = "application/x-www-form-urlencoded;charset=UTF-8")
ResultBody register(User user);
指定我们的传参形式,这样就可以进行调用,并且参数也能传递过去了。
总结
以上就是我对Feign远程调用工具的一些见解,水平有限,如有错误,欢迎评论指出!