Feign基本使用

423 阅读3分钟

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远程调用工具的一些见解,水平有限,如有错误,欢迎评论指出!