一.環境
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);
}
}