在用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(); } }
相关推荐
ajax post 上传图片springmvc获取并保存base64编码的图片的方法
java SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URL
"解决SpringMVC接收不到ajaxPOST参数的问题" SpringMVC是一款流行的Java Web框架,它提供了强大的MVC架构和灵活的配置机制。但是,在使用SpringMVC时,经常会遇到ajax POST请求参数接收不到的问题。本文将探讨解决...
本教程将详细解析Spring MVC后台接收请求参数的多种方式。我们将重点关注GET和POST请求,这两种请求方式在Web开发中最为常见。以下是对每种方式的详细说明: 1. **路径变量(Path Variables)** 在Spring MVC中,...
表单数据通常以POST请求的方式发送,SpringMVC会自动将这些参数绑定到控制器方法的参数上。对于简单类型,如`long`、`int`等,可以使用`@RequestParam`注解。对于复杂对象,可以直接作为方法参数,Spring会尝试将...
通过重写dispatcherservlet的一个doservice方法把springmvc的url对应方法打印出来。 所需要做的是: 1,使用本文件作为原先springmvc的xml文件的dispatcherservlet。 2,启动项目,随意发送一个请求,可以在控制台...
4. **Bean方式获取参数**:当请求参数较多时,可以创建一个Java Bean来映射所有参数。例如,`public String handle(UserInfo user) {...}`,`UserInfo`类的属性对应请求参数。未传递的参数值将为null,因此建议避免...
本实例代码着重讲解了SpringMVC中的四种映射方式以及拦截器的实现,这对于理解和掌握SpringMVC的请求处理机制至关重要。 1. **四种映射方式**: - **通配符映射**:`@RequestMapping("/path/*")`,星号(*)代表任意...
Spring MVC提供了多种方式来接收前端传递的数据,包括单独的参数、数组、列表以及自定义对象。本教程将重点讲解如何接收ajax和form表单传递的集合参数。 一、接收Ajax传递的集合参数 1. JSON格式数据:Ajax通常...
例如,当用户提交表单时,表单字段通常会作为查询参数或POST数据发送。通过在方法参数前加上`@RequestParam`并指定对应的参数名,Spring MVC会自动将请求中的相应参数值绑定到该方法参数上。例如: ```java @...
SpringMVC 参数收集及乱码处理 SpringMVC 框架提供了多种参数收集方式,...SpringMVC 提供了多种参数收集方式和乱码处理方式,以满足不同的应用场景需求。通过了解这些机制,我们可以更好地设计和实现 Web 应用程序。
这些方法接收请求参数,处理业务逻辑,并返回 ModelAndView 对象,该对象包含了模型数据和视图信息。 五、ModelAndView ModelAndView 是一个组合模型数据和视图的容器,它包含了用于渲染视图的数据以及要显示的视图...
本文将详细讲解四种不同的方法来接收并处理多个对象,以满足后端控制器从前端表单获取多名乘客信息的需求。 1. **表单提交,以字段数组接收** 这是最基础的方法,通过在HTML表单中定义相同名称的输入字段,但通过...
本文将深入解析SpringMVC如何处理GET和POST请求中的参数,以及如何使用@RequestParam和@RequestBody注解。 1. GET请求 GET请求通常用于获取资源,其参数直接附加在URL路径后面,以键值对的形式存在。例如,`/api/...
Axios 发送 POST 请求 Spring MVC 接收不到参数的解决方法 Axios 是一个流行的 JavaScript 库,用于发送 HTTP 请求。然而,在使用 Axios 发送 POST 请求时,有时可能会遇到 Spring MVC 无法接收到参数的情况。这篇...
处理请求参数有多种方式。你可以直接在方法签名中使用参数,如 `String name` 来获取请求参数;或者使用 `@RequestParam` 注解指定参数名。对于复杂的数据结构,可以使用 POJO 类绑定请求参数值,SpringMVC 会自动将...
解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题 SpringMVC 是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,广泛应用于Java Web开发中。但是,在使用SpringMVC时,常见的一个问题是...
在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...