场景:
微服务A调用微服务B的接口,微服务B的接口请求方式是get类型,传递的参数是JSON格式。
错误:
1、postman:springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.ArrayList<com.cechds.diagnosis.domain.OnlineRegisterScheduleDetail>` from Object value (token `JsonToken.START_OBJECT`);
2、微服务B:
心路历程:
1、我找了请求方式的问题,发现一点毛病没有,都是get请求,但是为啥微服务B中报错的原因尽然是请求方式不支持POST。
2、看了postman给我的报错原因,我也核实了请求参数是否传递有问题,最后发现也没毛病。
当我准备放弃时,向打开chat问一问它时,我就想既然你有报错时不支持POST请求,那我就把所有的请求方式改一下,都改成POST。最后启动项目,postman测试,发现通了。
然后,我冷静分析了一波……最后我明白了:出现问题的根本原因就是GET和POST请求方式的不同以及服务器和客户端对请求方式支持的程度不同导致的。
POST和GET的区别:
1、常规的设计原则是使用 GET 请求用于获取资源,而 POST 请求用于创建资源;
2、GET 请求通常用于查询,而查询参数通常会附加在 URL 上,而不是在请求体中传递 JSON 数据。因此,GET 请求通常不用于传递复杂的结构化数据,例如 JSON;
3、POST 请求通常用于在服务器上创建新资源,并且可以在请求体中传递复杂的结构化数据,例如 JSON。这种设计符合 RESTful 架构的原则,即使用不同的 HTTP 方法来表示不同的操作。
虽然 HTTP 规范并没有明确规定 GET 请求不能包含请求体,但是在实际应用中,许多服务器和客户端的实现对 GET 请求体的支持不够完善,可能导致一些不一致性和问题。在微服务之间进行 HTTP 调用时,通常建议遵循 RESTful 设计原则,并根据不同的操作选择适当的 HTTP 方法。如果需要传递数据,尤其是结构化数据,POST 请求通常被认为是更合适的选择。