赞
踩
通常我们利用request.getParameter(参数名称)来获取url上面或者ajax.data提交上来的参数,但是例如用httpClient中的httpPost.setEntry()的方法提交的参数是没有参数名称的, 使用request.getParameter(参数名称)便无法获取参数值,我们可以用request.getInputStream()(io流)方法来获取body中的内容,获取的是一个json串,再使用JSONObject.fromObject(json串);即可解析到里面各个参数的值。
假设我们获取的内容既有url提交的参数,也有httpClient中的httpPost.setEntry()的方法提交的参数,这个时候该怎么获取 参数的值呢,
正常思路应该是:先使用request.getParameter(参数名称)获取url上面的参数,
再使用request.getInputStream()(io流)获取body里面的无参数名称的内容
此时会发现使用io流获取的参数内容是null
原因是:servlet规范:同时满足下列条件,则请求体中的数据将被填充到Parameter集合中
1:是一个http/https请求
2:请求方法是post
3:请求类型(content-Type)是application/x-www-form-urlencoded
4: Servlet调用了getParameter系列方法
如果上述条件没有同时满足,则相关的表单数据不会被设置进request的parameter集合中,
相关的数据可以通过request.getInputStream()来访问。反之,如果上述条件均满足,
相关的表单数据将不能再通过request.getInputStream()来读取。
根据这个规范的说明,当我们在调用request.getParameter(参数名称)的方法时,
通过httpClient中的httpPost.setEntry()提交的数据(请求体)被填充到了parameter集合中了,
所以后面的通过request.getInputStream获取数据流时就为空。
最终这个问题的解决方案是把request.getParameter(参数名称);
放到request.getInputStream之后,这样就回避了servlet的规范,可以正常获取想要的参数值了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。