最近在跟ONENET平台对接设备数据的时候,从平台下载的JAVA版本的SDK嵌入到自己的项目中使用,使用POSTMAN测试GET请求的时候是没问题的,测试POST请求接收数据的时候就报了415错误!从网上找了各种解决办法,没有一款是适用我这个项目的,通通没用,后来发现是spring的注解@RequestBody接收数据的问题,后来就替换成原始接收数据的方法就可以了(HttpServletRequest)
由于SDK用的是BODY来处理的数据,所以我们需要把request中的参数转成字符串body
public String receive(HttpServletRequest request, HttpServletResponse rsp) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String body = IOUtils.read(reader);
}
IOUtils用的是dubbo-2.5.3
就这样困扰了两天的问题自己发现并自己解决(过程中找过ONNET平台技术员和设备厂商拉了个群聊把问题反馈出来一直没得到解决,最让我无语的是跟我对接的ONNET平台技术员是搞PYTHON,设备厂商的技术员是搞C#的跟他们搞对接真痛苦,因为他们自己的DEMO我不能直接拿来用)
下面说说,我这两天在网上找的解决办法,一般下面几种解决办法都足够解决你的问题,实在不行就用我上面的最原始的解决办法:
一、参考的是:https://www.iteye.com/blog/snowolf-1628861
主要就是需要开启XML核心配置
然后pom.xml配置
org.springframework
spring-webmvc
3.1.2.RELEASE
jar
compile
org.codehaus.jackson
jackson-mapper-asl
1.9.8
jar
compile
log4j
log4j
1.2.17
compile
二、参考的是https://blog.csdn.net/jdk_wangtaida/article/details/85783289
@requestBody注解的使用
1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
2. @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象
解决方案:前端传参数时,设置content-type类型就可以啦,设置成application/json
三、参考的是https://blog.csdn.net/g_y_x_/article/details/84339648
主要说的是检查JAR包和配置的问题
1.maven引入jackson包,共3个【重要】
jackson-core
jackson-databind
jackson-annotations
2.springmvc的配置文件【重要】
3.没有自动将包导入WEB-INF/lib中
四、这里说的是没有使用浏览器请求,被拒POSTMAN没有模拟浏览器POST
我一个同事说使用swagger测是不会包415的,是正常的
使用模拟浏览器工具测试
五、说的是JAR包不一致导致的
六、说的是spring3.0和spring4.0使用
3.0的是
MappingJacksonHttpMessageConverter
4.0的是
MappingJackson2HttpMessageConverter