application/x-www-form-urlencoded 类型的请求,Spring mvc后台获取不到数据?

KerryLi 发布于 2017/06/12 15:23
阅读 5K+
收藏 0

这个是通过socket可以读取到请求的信息,

POST /acc HTTP/1.1
Host: 192.168.1.20:8888
Accept: */*
Content-Length: 306
Content-Type: application/x-www-form-urlencoded

KG|j^GIzDr]ZDRmt�e��"�E�X|$���z,Z� ��/��:e� �
�:�Z�*��w�z��lO�v�^]@�]�`y#B�L%�������5F�C�=V�f�S��N[嚄�>H
� �?�&�C乪fǩ�f�#^ܯVZ�ǗyWi!y��"f�1ЌZ�|+������Pt.]��Ҳ���

 

前台没代码,前台是买的户外大型wifi探针设备, 探针设备会定时post推送数据到指定的服务器,, 192.168.1.20:8888就是配置的接收探针推送的数据的服务器(局域网内测试),

目前通过socket监听8888端口可以获取以上探针推送的带有乱码的内容,

如果以spring mvc的形式, 获取post过来的数据, 就完全获取不到,啥内容都木有。

 

后台代码

   @RequestMapping("/")
    public void acc(HttpServletRequest request,@RequestBody String body,HttpServletResponse response) throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss");
        
        //request.getInputStream()//也获取不到 body里面的内容,, 
         BufferedReader reader = new BufferedReader(
                 new InputStreamReader(request.getInputStream()));
         String line=null;
         StringBuilder buffer = new StringBuilder();
         while((line = reader.readLine())!=null){
                 buffer.append(line);
               }
         System.out.println("buffer str : "+buffer.toString());
        
        System.out.println(sdf.format(new Date())+"post begin.......");
        System.out.println("body:"+body);
         String keyandValue="";  
         String key="";  
         String value="";
        Iterator<String> it=request.getParameterMap().keySet().iterator();  
        while(it.hasNext()){  
            key=it.next();  
            value = ((Object[])(request.getParameterMap().get(key)))[0].toString();  
            keyandValue=key+"="+value;  
            System.out.println(key+"= "+value);  
        }  
        
        
        System.out.println(sdf.format(new Date())+"post end.......");
    }

 

post已经到acc方法中去了。sysout可以打印出消息

 

后台通过spring mvc的方式,通过流,通过getParamterNames()都获取不到数据

 

加载中
0
KerryLi
KerryLi

被重定向了。所以获取不到数据了。因为项目名称直接是acc,然后controller的reqeustmapping写的是“/”,所以请求 http://xxxxxx:xx/acc的请求直接回变成 http://xxxxxx:xx/acc/ 这个,后面自动多加了斜杠,结果数据就获取不到了,

0
努力推石头的西西弗斯
KerryLi
KerryLi
上面是通过socket读取的信息 可以获取到内容,,通过spring mvc 方式,获取不到内容 ,spring mvc为的就是获取那个乱码的内容
0
培公啊
培公啊

贴下前后台代码

KerryLi
KerryLi
没前台代码,, spring mvc接收wifi探针推送过来的数据(post方式),上面的那个乱码的信息以及http1.1都是wifi探针推送的数据,,用socket流读取没问题,用request就歇菜了。
0
云颖
云颖

你请求的url是这个  /acc  ,但是你定义的controller中映射的url是 / 你当然收不到请求了,收到了就怪了。

云颖
云颖
回复 @KerryLi : 你把真个controller的代码贴一下
KerryLi
KerryLi
acc前缀有哦,项目名称就是acc, 请求会进来的,, 有debug信息断点会进去的。
0
云颖
云颖
@Controller
@RequestMapping("/")
public class TestController {

    @RequestMapping("/acc")
    public void acc(HttpServletRequest request,@RequestBody String body,HttpServletResponse response) throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        //request.getInputStream()//也获取不到 body里面的内容,, 
        
        System.out.println(sdf.format(new Date())+"post begin.......");
        System.out.println("body:"+body);
         String keyandValue="";  
         String key="";  
         String value="";
        Iterator<String> it=request.getParameterMap().keySet().iterator();  //更是啥内容都没有。 
        while(it.hasNext()){  
            key=it.next();  
            value = ((Object[])(request.getParameterMap().get(key)))[0].toString();  
            keyandValue=key+"="+value;  
            System.out.println(key+"= "+value);  
        }  
        
        
        System.out.println(sdf.format(new Date())+"post end.......");
    }
}

你controller改成这样试试

KerryLi
KerryLi
可能我问题没描述清楚, 刚更新了描述问题,可以进去acc方法内,可以sysout出字符串信息, debug可以进去方法。不是访问路径问题。。
0
云颖
云颖

不知道你问题解决了没有。首先你得确定设备给你post过来的Request Body里面的数据二进制数据,还是某种格式的文本数据(json、queryString、xml),然后再确定你给定的Content-Type是否合适

云颖
云颖
回复 @KerryLi : public void acc(HttpServletRequest request,@RequestBody String body,HttpServletResponse response) throws Exception 这里面定义的body变量里面没有数据吗?
KerryLi
KerryLi
设备post过来的是 rc4的加密数据,就是一串字符串而已,就是string处理
0
y
yue_zxl

application/x-www-form-urlencoded 是表单提交,你的请求发过去,后台获取到的是一个键值对。你可以用postman或者火狐的httprequester模拟post请求,可以看到,如果在content中传入字符串,后台获取到的body中是将content映射为key,value相当于没值。

 

KerryLi
KerryLi
明白你意思了。 使用application/x-www-form-urlencoded 是表单提交, 后台body内容都获取的不到的,因为映射成key ,value了。而设备推送的内容是content是一个不是键值对的字符串, 所以就是为什么可以写sokcetServer的流的形式才能获取到。
0
y
yue_zxl

eclipse断点调试获取到的body如下

0
KerryLi
KerryLi

项目中如果默认访问 acc/走的项目名称,是获取不到的,   更改项目的context 也就是tomcat中 path改为 / ,然后requestMapping的路径写 /acc,这样就可了。

返回顶部
顶部