SpringCloud使用feign远程调用之@RequestBody,@RequestParam,@SpringQueryMap注解实例(远程调用变得容易)
feign远程调用使用@RequestBody与@RequestParam注解采坑之旅
·
SpringCloud使用feign远程调用之@RequestBody、@RequestParam、@SpringQueryMap注解实例
对@RequestBody,@RequestParam,@SpringQueryMap理解如下
1.@RequestBody使用于@RequestBody方式接收参数的生产者。
a.生产者代码(被feign调用)controller层:
@PostMapping("comment")
// OrderCommentDTO是请求实体参数
public JsonResult comment( @RequestBody @Valid OrderCommentDTO formDTO,
HttpServletRequest request,
BindingResult e){
System.out.println("itemService端调用成功");
String resultId = request.getParameter("resultId");
System.out.println("测试参数传递:"+resultId);
if(e.hasErrors()){
return JsonResult.err();
} else {
return JsonResult.ok().msg("远程调用成功");
}
}
b.消费者Controller层:
@PostMapping("/comment")
JsonResult comment(@RequestBoy @Valid OrderCommentDTO formDTO) {
System.out.println("feign端controller调用成功");
return itemServcie.comment(formDTO);
}
c.消费者Service层代码
@FeignClient(name="item-service",fallback = ItemFeignServiceFB.class)
public interface ItemFeignService {
@PostMapping("/comment")
public JsonResult comment(@RequestBody @Valid OrderCommentDTO formDTO);
}
d.当生产者(被feign调用)入参位置实体发生变化 时,
@PostMapping("comment")
public JsonResult comment(HttpServletRequest request,
@RequestBody @Valid OrderCommentDTO formDTO,
BindingResult e){
System.out.println("itemService端调用成功");
String resultId = request.getParameter("resultId");
System.out.println("测试参数传递:"+resultId);
if(e.hasErrors()){
return JsonResult.err();
} else {
return JsonResult.ok().msg("远程调用成功");
}
}
- 当有多个请求实体参数时
a.直接上生产者的代码(为了增加参数的的复杂度故意多加了几个参数,但是调用过程换汤不换药,去掉HttpServletRequest request,BindingResult两个请求参数不影响调用),生产者的入参方式是form-data格式:
@PostMapping("/test")
public JsonResult testParam(HttpServletRequest request,TestPo1 testPo1,TestPo2 testPo2,BindingResult e) {
return JsonResult.ok().msg("远程调用测试成功!!");
}
b.请求实体
@Data主要用于添加get和set方法
@Data
public class TestPo1 {
Integer id;
}
@Data
public class TestPo2 {
Integer ids;
}
c.消费者feign远程调用Service层
@FeignClient(name="item-service",fallback = ItemFeignServiceFB.class)
public interface ItemFeignService {
@PostMapping("/test")
JsonResult testFeignParam(
//注意引号内的参数名必须与被调用的接口的参数名相同,多个可以还用多个参数就可以了
@RequestParam("id")Integer id,
@RequestParam("ids")Integer ids
);
}
d.消费者远程调用Controller层
@PostMapping("/test")
public JsonResult testFeignParam(TestPo1 testPo1,TestPo2 testPo2) {
return itemServcie.testFeignParam(testPo1.getId(),testPo2.getIds());
}
3.当远程调用的参数是类型参数时
a.生产者代码
@PostMapping("/test")
public JsonResult testParam(HttpServletRequest request,String testType1,Integer testType2,BindingResult e) {
return JsonResult.ok().msg("远程调用测试成功!!");
}
b.消费者feign远程调用Service层
@FeignClient(name="item-service",fallback = ItemFeignServiceFB.class)
public interface ItemFeignService {
@PostMapping("/test")
JsonResult testFeignParam(
//注意引号内的参数名必须与被调用的接口的参数名相同
@RequestParam("testType1")String testType1,
@RequestParam("testType2")Integer testType2
);
}
c.消费者远程调用Controller层
@PostMapping("/test")
public JsonResult testFeignParam(String testType1,Integer testType2) {
return itemServcie.testFeignParam(testType1,testType2);
}
4.当远程调用的接口实体类参数只有一个,但是没有@RequestBody注解实体类中又有较多的参数又该如何调用呢,这种倘若使用form-data的方式调用的话,请求实体参数过多,接口过于臃肿。
@PostMapping("/test")
public JsonResult testParam(HttpServletRequest request,TestPo1 testPo1,TestPo2 testPo2,BindingResult e) {
return JsonResult.ok().msg("远程调用测试成功!!");
}
b.请求实体
@Data主要用于添加get和set方法
@Data
public class TestPo1 {
Integer id;
String name;
}
@Data
public class TestPo2 {
Integer ids;
String name;
}
c.消费者feign远程调用Service层
@FeignClient(name="item-service",fallback = ItemFeignServiceFB.class)
public interface ItemFeignService {
@PostMapping("/test")
JsonResult testFeignParam(
@SpringQueryMap TestPo1 testPo1,
@SpringQueryMap TestPo2 testPo2
);
}
d.消费者远程调用Controller层
@PostMapping("/test")
public JsonResult testFeignParam(TestPo1 testPo1,TestPo2 testPo2) {
return itemServcie.testFeignParam(testPo1,TestPo2);
}
更多推荐
所有评论(0)