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("远程调用成功");
    }
}
  1. 当有多个请求实体参数时
    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);
	}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐