`
bsr1983
  • 浏览: 1121995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springmvc 获取ios以Boundary方式POST的参数失败时的解决方法

 
阅读更多

在用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();
            }
        }
 
0
1
分享到:
评论

相关推荐

    springmvc获取并保存base64编码的图片的方法

    ajax post 上传图片springmvc获取并保存base64编码的图片的方法

    Springmvc获取URL

    java SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URLjava SpringMVC获取URL

    解决SpringMVC接收不到ajaxPOST参数的问题

    "解决SpringMVC接收不到ajaxPOST参数的问题" SpringMVC是一款流行的Java Web框架,它提供了强大的MVC架构和灵活的配置机制。但是,在使用SpringMVC时,经常会遇到ajax POST请求参数接收不到的问题。本文将探讨解决...

    SpringMVC后台接收请求参数的几种方式Demo

    本教程将详细解析Spring MVC后台接收请求参数的多种方式。我们将重点关注GET和POST请求,这两种请求方式在Web开发中最为常见。以下是对每种方式的详细说明: 1. **路径变量(Path Variables)** 在Spring MVC中,...

    SpringMVC接收请求参数所有方式总结

    表单数据通常以POST请求的方式发送,SpringMVC会自动将这些参数绑定到控制器方法的参数上。对于简单类型,如`long`、`int`等,可以使用`@RequestParam`注解。对于复杂对象,可以直接作为方法参数,Spring会尝试将...

    springmvc所有方法url映射获取

    通过重写dispatcherservlet的一个doservice方法把springmvc的url对应方法打印出来。 所需要做的是: 1,使用本文件作为原先springmvc的xml文件的dispatcherservlet。 2,启动项目,随意发送一个请求,可以在控制台...

    SpringMVC之请求参数的获取方式.pdf

    4. **Bean方式获取参数**:当请求参数较多时,可以创建一个Java Bean来映射所有参数。例如,`public String handle(UserInfo user) {...}`,`UserInfo`类的属性对应请求参数。未传递的参数值将为null,因此建议避免...

    SpringMVC四种映射方式实例代码

    本实例代码着重讲解了SpringMVC中的四种映射方式以及拦截器的实现,这对于理解和掌握SpringMVC的请求处理机制至关重要。 1. **四种映射方式**: - **通配符映射**:`@RequestMapping("/path/*")`,星号(*)代表任意...

    springMvc集合接收参数的用法

    Spring MVC提供了多种方式来接收前端传递的数据,包括单独的参数、数组、列表以及自定义对象。本教程将重点讲解如何接收ajax和form表单传递的集合参数。 一、接收Ajax传递的集合参数 1. JSON格式数据:Ajax通常...

    springmvc 参数绑定例子

    例如,当用户提交表单时,表单字段通常会作为查询参数或POST数据发送。通过在方法参数前加上`@RequestParam`并指定对应的参数名,Spring MVC会自动将请求中的相应参数值绑定到该方法参数上。例如: ```java @...

    SpringMVC参数收集及乱码处理.docx

    SpringMVC 参数收集及乱码处理 SpringMVC 框架提供了多种参数收集方式,...SpringMVC 提供了多种参数收集方式和乱码处理方式,以满足不同的应用场景需求。通过了解这些机制,我们可以更好地设计和实现 Web 应用程序。

    SpringMVC PPT_springmvc_

    这些方法接收请求参数,处理业务逻辑,并返回 ModelAndView 对象,该对象包含了模型数据和视图信息。 五、ModelAndView ModelAndView 是一个组合模型数据和视图的容器,它包含了用于渲染视图的数据以及要显示的视图...

    SpringMVC接收多个对象的4种方法

    本文将详细讲解四种不同的方法来接收并处理多个对象,以满足后端控制器从前端表单获取多名乘客信息的需求。 1. **表单提交,以字段数组接收** 这是最基础的方法,通过在HTML表单中定义相同名称的输入字段,但通过...

    Http请求传参SpringMVC接收参数详细解析

    本文将深入解析SpringMVC如何处理GET和POST请求中的参数,以及如何使用@RequestParam和@RequestBody注解。 1. GET请求 GET请求通常用于获取资源,其参数直接附加在URL路径后面,以键值对的形式存在。例如,`/api/...

    axios发送post请求springMVC接收不到参数的解决方法

    Axios 发送 POST 请求 Spring MVC 接收不到参数的解决方法 Axios 是一个流行的 JavaScript 库,用于发送 HTTP 请求。然而,在使用 Axios 发送 POST 请求时,有时可能会遇到 Spring MVC 无法接收到参数的情况。这篇...

    SpringMVC完整使用教程

    处理请求参数有多种方式。你可以直接在方法签名中使用参数,如 `String name` 来获取请求参数;或者使用 `@RequestParam` 注解指定参数名。对于复杂的数据结构,可以使用 POJO 类绑定请求参数值,SpringMVC 会自动将...

    解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题 SpringMVC 是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,广泛应用于Java Web开发中。但是,在使用SpringMVC时,常见的一个问题是...

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...

Global site tag (gtag.js) - Google Analytics