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