微服务踩坑记录之消费者服务传参问题解决

microservice-parent.zip

RestTemplate使用示例Demo,一共包括三个服务:公共API服务、提供者服务、消费者服务。其中示例了服务之间的相互调用和两个方法示例。分别为新增数据和查询方法示例。有兴趣的可以自行下载学习。

立即下载

你知道的越多,你不知道的越多;本文仅做记录,方便以后备阅。希望也能帮到正在看这篇文章的你。

目录

1、关于@RequestBody注解

2、使用RestTemplate前,不加@RequestBody注解效果

2.1 controller层示例代码如下

2.2 启动项目,利用Postman测试

3、使用RestTemplate时,不加@RequestBody注解效果

3.1 控制层调用提供者controller层代码如下:

3.2 启动项目,使用Postman测试 

4、使用RestTemplate时,添加@RequestBody注解效果

5、分析原因,解决

5.1 分析

5.2 解决


接下来开始正题...

1、关于@RequestBody注解

@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容。

比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,

当然,也可以将其分别绑定到对应的字符串上。

2、使用RestTemplate前,不加@RequestBody注解效果

2.1 controller层示例代码如下

	@PostMapping(value="/create")
	@ResponseBody
	public CommonResult create(Payment payment) {
		int flag = paymentService.create(payment);
		if (flag==0) {
			return CommonResult.error("---添加失败!---");
		}else{
			return CommonResult.ok("---添加成功!---");
		}
	}

2.2 启动项目,利用Postman测试

将数据库初始化为空

Postman请求方法改完post,请求路径为

localhost:8001/create?serial=上海市

然后点击Send,如图所示:

数据库结果为:

实验成功,在不使用RestTemplate调提供者新增方法时,可以暂时不加@RequestBody是允许的。接下来我们再创建一个消费者模块,使用RestTemplate来调取这个create()方法。

3、使用RestTemplate时,不加@RequestBody注解效果

3.1 控制层调用提供者controller层代码如下:

我们称之为消费者

	private static String REST_URL_PREFIX = "http://localhost:8001";

	@Autowired
	private RestTemplate restTemplate;

	@GetMapping(value = "/consumer/create")
	public CommonResult create(Payment payment) {
		log.info(payment.toString());
		CommonResult result = restTemplate.postForObject(REST_URL_PREFIX + "/create", payment, CommonResult.class);
		log.info(result.toString());
		return result;
	}

3.2 启动项目,使用Postman测试 

将数据库初始化为空

Postman请求方法改完get,因为我们现在是get请求,所以请求路径为

localhost:9001/consumer/create?serial=上海市

然后点击Send,如图所示:

请求结果同样返回成功,那么;我们接下来看数据库结果:

数据没拿到,为什么呢?这时候我们就要回过头看@RequestBody注解含义了。原因我们通过Dug分析是因为消费者服务通过RestTemplate请求到提供者服务的create()方法时,没有拿到消费者传过来的数据。

4、使用RestTemplate时,添加@RequestBody注解效果

我们把@RequestBody加在create()方法的参数前;

	@PostMapping(value="/create")
	@ResponseBody
	public CommonResult create(@RequestBody Payment payment) {
		int flag = paymentService.create(payment);
		if (flag==0) {
			return CommonResult.error("---添加失败!---");
		}else{
			return CommonResult.ok("---添加成功!---");
		}
	}

然后重启提供者服务,这时我们再用Postman测试看一下效果如何:

同样是新增成功的标识,那么我们具体看一下数据库数据是否插入:

这时我们看到数据库是成功插入了一条数据。

这时我们再用Postman测试提供者服务的create()方法,看看是否能成功

结果,Postman给我们报了一个错误;当然控制台肯定也是报错了。

5、分析原因,解决

5.1 分析

我们使用Postman虽然选择了post请求,但是其实是使用了get的请求方式,可以看到自己手动添加的参数都被直接赋值到了URL后面。

5.2 解决

选择post请求,Headers中选择application/json内容格式

在Body内输入json格式的字符串,点击send,返回成功

我们这时候查看数据库,已经新增一条数据成功;


由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!

发布了28 篇原创文章 · 获赞 38 · 访问量 1万+
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览