在用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(); } }
相关推荐
Springmvc请求处理方法参数Springmvc请求处理方法参数
SpringMVC后台接收请求参数的几种方式源码。总结了常用的注解,介绍GET和POST请求方式下的参数传递方法。
ajax post 上传图片springmvc获取并保存base64编码的图片的方法
java SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URL
springMVC 采用POST提交的方法接收json格式的参数需要的jar包
今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
SpringMVC之请求参数的获取方式.pdfSpringMVC之请求参数的获取方式.pdfSpringMVC之请求参数的获取方式.pdfSpringMVC之请求参数的获取方式.pdfSpringMVC之请求参数的获取方式.pdfSpringMVC之请求参数的获取方式....
在我的博客中说到了,Springmvc获得参数的几种方式,共四方式,总结分享给大家咯
通过重写dispatcherservlet的一个doservice方法把springmvc的url对应方法打印出来。 所需要做的是: 1,使用本文件作为原先springmvc的xml文件的dispatcherservlet。 2,启动项目,随意发送一个请求,可以在控制台...
springmvc各种参数绑定源码实现
GET方法请求参数处理 2 表单参数 3 【非对象】- 非对象类型单个参数接收。 3 【对象】 - 对象类型参数接收。 4 【数组】 - 列表或者数组类型参数。 5 JSON参数 6 URL路径参数 6 文件上传 8 其他参数 8 请求头 9 ...
springmvc 参数绑定例子,ajax 绑定,form绑定,对象绑定,参数绑定
自定义注解:SpringBoot中针对SpringMvc自定义注解获取用户登陆信息
本demo 用来写了springmvc如何接受ajax传集合以及接收form表单传集合
下面小编就为大家分享一篇axios发送post请求springMVC接收不到参数的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2423933
springMVC 上传文件方式springMVC 上传文件方式springMVC 上传文件方式
springmvc基础 包含代码+知识点+详细解释 1. 什么是springmvc? 2. springmvc框架原理 前端控制器、处理器映射器、处理器适配器、视图解析器 3. springmvc入门程序 目的:对前端控制器、处理器映射器、处理器...
主要是工作中遇到的一些springMVC前台往后台传递参数的一些不同形式的后台的解决方式
本篇文章主要介绍了SpringMVC——如何获取请求参数详解,详细的介绍了每种参数注解的用法。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。