springcloud feign接口传参详解

一.环境

springboot 2.2.1.RELEASE

springcloud Hoxton.RELEASE

compile 'io.github.openfeign:feign-httpclient'

compile 'org.springframework.cloud:spring-cloud-starter-openfeign'

二.各情况参数传递总结:

1.get传递普通参数,@GetMapping需要添加@RequestParam("msg")注解
2.不要用get传递封装类参数,如需传递封装类参数,用postmapping
3.post传递普通参数加@RequestBody或者@RequestParam都可以,但是不能什么都不加
4.post传递封装类参数,feign接口需要添加@RequestBody
5.post传递list参数:
    5.1.普通list,需要用数组接收,添加@RequestParam("lists")
    5.2.封装类list,需要添加@RequestBody

源码:

SdkTest.java
 

@Validated
public interface SdkTest {
    
    @GetMapping("test1")
    public String test(String msg);
    
    @GetMapping("test2")
    public Response<String> test2(@RequestParam("msg") String msg);
    
    @PostMapping("test3")
    public Response<String> test3(@RequestParam("msg") String msg);
    
    @PostMapping("test4")
    public Response<String> test4(@RequestBody String msg);
    
    @PostMapping("test41")
    public Response<String> test41(String msg);
    
    @PostMapping("test5")
    public Response<List<String>> test5(@RequestParam("lists") String[] lists);
    
    @Data
    public static class User {
        
        private Long id;
        
        private Long appId;
        
        private String name;
        
        private String detail;
        
        private Integer age;
        
    }
    /** getmapping 接受封装对象也要用@RequestBody 否则feign接口获取到参数为空 
     *  <br>但是!get+body的话,原服务调用需要get传json才能获取到值,不方便传参,
     *  <br>所以,获取对象传参这种方式,统一采用postmapping 
     * @see SdkTest#test8(User) */
    @GetMapping("test6")
    public Response<User> test6(@RequestBody User user);
    
    /** 如果没加@RequestBody 则feign接口过来获取参数为空 */
    @GetMapping("test7")
    public Response<User> test7(User user);
    
    @PostMapping("test8")
    public Response<User> test8(@RequestBody User user);
    
    @PostMapping("test81")
    public Response<User> test81(@RequestParam("user") User user);
    
    @PostMapping("test82")
    public Response<User> test82(User user);
    
    @PostMapping("test9")
    public Response<List<User>> test9(@RequestBody List<User> user);

}

服务端

@RestController
public class SdkControler implements SdkTest {

    @Override
    public String test(String msg) {
        return msg;
    }

    @Data
    public static class User{

        @NotBlank(message = "{required}")
        private String name;

        @NotNull(message = "{required}")
        private Integer age;

    }
    
    @Override
    public Response<String> test2(String msg) {
        return success(msg);
    }

    @Override
    public Response<String> test3(String msg) {
        return success(msg);
    }

    @Override
    public Response<String> test4(String msg) {
        return success(msg);
    }
    
    @Override
    public Response<String> test41(String msg) {
        return success(msg);
    }

    @Override
    public Response<List<String>> test5(String[] lists) {
        return success(Lists.newArrayList(lists));
    }

    @Override
    public Response<com.cqliving.cloud.sdk.SdkTest.User> test6(com.cqliving.cloud.sdk.SdkTest.User user) {
        return success(user);
    }

    @Override
    public Response<com.cqliving.cloud.sdk.SdkTest.User> test7(com.cqliving.cloud.sdk.SdkTest.User user) {
        return success(user);
    }

    @Override
    public Response<com.cqliving.cloud.sdk.SdkTest.User> test8(com.cqliving.cloud.sdk.SdkTest.User user) {
        return success(user);
    }
    
    @Override
    public Response<com.cqliving.cloud.sdk.SdkTest.User> test81(com.cqliving.cloud.sdk.SdkTest.User user) {
        return success(user);
    }
    
    @Override
    public Response<com.cqliving.cloud.sdk.SdkTest.User> test82(com.cqliving.cloud.sdk.SdkTest.User user) {
        return success(user);
    }
    
    @Override
    public Response<List<com.cqliving.cloud.sdk.SdkTest.User>> test9(List<com.cqliving.cloud.sdk.SdkTest.User> user) {
        return success(user);
    }
}

客户端:

@RestController
public class SdkTestController {

    @Autowired
    private SdkTestClient testClient;

    @GetMapping("test1")
    public String test(String msg) {
        return testClient.test(msg);
    }

    @GetMapping("test2")
    public Response<String> test2(String msg) {
        return testClient.test2(msg);
    }

    @PostMapping("test3")
    public Response<String> test3(String msg) {
        return testClient.test3(msg);
    }

    @PostMapping("test4")
    public Response<String> test4(String msg) {
        return testClient.test4(msg);
    }
    @PostMapping("test41")
    public Response<String> test41(String msg) {
        return testClient.test41(msg);
    }

    
    private String pattern = "[,,\\s|]";
    @PostMapping("test5")
    public Response<List<String>> test5(String lists) {
        return testClient.test5(lists.split(pattern));
    }
    
    @GetMapping("test6")
    public Response<User> test6(User user){
        return testClient.test6(user);
    }
    
    @GetMapping("test7")
    public Response<User> test7(User user){
        return testClient.test7(user);
    }
    
    @PostMapping("test8")
    public Response<User> test8(User user){
        return testClient.test8(user);
    }
    
    @PostMapping("test81")
    public Response<User> test81(User user){
        return testClient.test81(user);
    }
    
    @PostMapping("test82")
    public Response<User> test82(User user){
        return testClient.test82(user);
    }
    
    @PostMapping("test9")
    public Response<List<User>> test9(@RequestBody List<User> user){
        return testClient.test9(user);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值