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);
    }
}

 

發佈了50 篇原創文章 · 獲贊 69 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章