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

猜你喜欢

转载自bsr1983.iteye.com/blog/2119656