在用springmvc做后台时,需要为ios,java web,android提供统一的接口,但编写完接口后,java web和android通过 post提交上来的参数都可以获得,但ios的获取不到。
通过nigix转发获取ios请求的http post的内容 发现ios是通过Boundary 方式来post http 请求参数的。
具体参见:
1)ios的post请求格式:
192.168.1.1 - - [22/Sep/2014:15:53:31 +0800] "POST /myservice/some.do HTTP/1.1" 200 75 "-" "%E7%A7%80%E8%89%B2%E7%9B%B4%E6%92%AD/6.6.0 CFNetwork/672.1.13 Darwin/13.3.0" - --Boundary+0xAbCdEfGbOuNdArY\x0D\x0AContent-Disposition: form-data; name=\x22json\x22\x0D\x0A\x0D\x0A{\x22data\x22:{\x22devicetoken\x22:\x22\x22,\x22.....}}\x0D\x0A--Boundary+0xAbCdEfGbOuNdArY--\x0D\x0A
2)android的post请求格式:
192.168.1.2 - - [22/Sep/2014:16:00:33 +0800] "POST /myservice/some.do?someparam=5&is_android=1 HTTP/1.1" 200 299 "-" "showself_A_6.6.0_4.1.1_HTC T528d" - json={\x22data\x22:{\x22skeyver\x22:5,........\x22}}
通过调试,发现android的请求中可以获取到HttpServletRequest request对象中的postData属性中的参数内容,而ios的request对象中的postData为null。
分别尝试了如下几种方式
(1)尝试通过在springmvc配置CommonsMultipartResolver来拦截,以及在请求的方法上增加
CommonsMultipartResolver配置,自动处理无效。
<!-- allows for integration of file upload functionality --> <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"> <property name="maxUploadSize" value="100000000"/> </bean>
(2)尝试判断
request是否为附件上传请求,获取文件,尝试失败
//创建一个通用的多部分解析器.
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//设置编码
commonsMultipartResolver.setDefaultEncoding("utf-8");
//判断 request 是否有文件上传,即多部分请求...
if (commonsMultipartResolver.isMultipart(request))
{
System.out.println("request instanceof MultipartHttpServletRequest");
commonsMultipartResolver.getFileUpload().getFileItemFactory();
MultipartHttpServletRequest multipartRequest =
commonsMultipartResolver.resolveMultipart(request);
// file 是指 文件上传标签的 name=值
// 根据 name 获取上传的文件...
MultipartFile file = multipartRequest.getFile("file");
try {
String jsonstr=new String(file.getBytes(),"utf-8");
} catch (IOException e) {
e.printStackTrace();
}
}
(3)尝试获取输入流,转换为字符串,失败
//创建一个通用的多部分解析器.
CommonsMultipartResolver commonsMultipartResolver = new
CommonsMultipartResolver(request.getSession().getServletContext());
//设置编码
commonsMultipartResolver.setDefaultEncoding("utf-8");
//判断 request 是否有文件上传,即多部分请求...
if (commonsMultipartResolver.isMultipart(request))
{
System.out.println("request instanceof MultipartHttpServletRequest");
commonsMultipartResolver.getFileUpload().getFileItemFactory();
MultipartHttpServletRequest multipartRequest =
commonsMultipartResolver.resolveMultipart(request);
// file 是指 文件上传标签的 name=值
// 根据 name 获取上传的文件...
try {
InputStream resStream = postMethod.getResponseBodyAsStream();
StringBuffer resBuffer = new StringBuffer();
String resTemp = "";
while ((resTemp = br.readLine()) != null) {
resBuffer.append(resTemp);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(multipartRequest.getInputStream()));
reader.readLine()
jsonstr=inputStreamToString(multipartRequest.getInputStream(),"utf-8");
jsonstr=new String(file.getBytes(),"utf-8");
} catch (IOException e) {
System.out.println("IOException "+e.toString());
e.printStackTrace();
}
}
public static String inputStreamToString(InputStream in,String encoding) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[10240];
int count = -1;
while((count = in.read(data,0,10240)) != -1)
{
outStream.write(data, 0, count);
}
data = null;
return new String(outStream.toByteArray(),encoding);
}
还有其他不同获取文件、输入流及转换为字符串的方式就不再列举了,最终使用的成功获取到参数的方法
需要加一个判断,看当前要获取的参数是否可以直接通过request.
getParameter();方法获取到,获取不到再采用如下的方式,否则web请求和android请求会报错。
//创建一个通用的多部分解析器.
CommonsMultipartResolver commonsMultipartResolver = new
CommonsMultipartResolver(request.getSession().getServletContext());
//设置编码
commonsMultipartResolver.setDefaultEncoding("utf-8");
//判断 request 是否有文件上传,即多部分请求...
if (commonsMultipartResolver.isMultipart(request))
{
try {
MultipartHttpServletRequest multipartRequest =
commonsMultipartResolver.resolveMultipart(request);
paramValue=multipartRequest.getParameter("paramName");
} catch (Exception e) {
System.out.println("IOException "+e.toString());
e.printStackTrace();
}
}