在用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(); } }