javaweb和app的前后台交互与Content-Type理解得出的解决方案

  最近在做一个微信小程序,发现后台获取前台发送的数据,不能通过传统的springmvc 直接映射获取,通过参考案列小程序,发现获取小程序参数是这样的,代码如下。

        StringBuilder sb = new StringBuilder();
        try (BufferedReader reader = request.getReader();) {
            char[] buff = new char[1024];
            int len;
            while ((len = reader.read(buff)) != -1) {
                sb.append(buff, 0, len);
            }
            	result = JSONObject.parseObject(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
没想到获取前台请求的还有这种骚操作,带着困惑,我通过查看小程序和网页发送的请求头信息,找到了区别所在,

小程序请求头信息如下

web请求的头信息如下


由此我发现了区别小程序请求的头信息中content-type是 application/json 而web中请求的头信息是application/x-www-form-urlencoded;charset-utf-8,我在想问题出在这儿了,在这里我们用的都是post请求,带着好奇我测试了下get请求,发现无论在小程序还是在web端都能通过映射获取参数,于是我也带着好奇查看get请求的头信息


通过查看我发现在web端还是在小程序端,都没有content-type这个头信息。由此我分析当头信息 content-type:application/json时是无法通过我们传统的springmvc映射获取请求的参数。而其它的形式是可以的,还有没有提到的文件上传时,content-type的请求参数是mutilpart/form-data,也是可以通过映射获取的。

至于原理小左技术不够,需要深入理解springmvc参数映射的原理也许能解答这个问题,知道的方便给小左一个答案在评论里,谢谢。

不过我在查看文档时,发现了这么一段内容,贴在下面,可以多学点。

request.getParameter()
request.getInputStream()
request.getReader()
这三个方法都是从request对象中得到提交的数据,但是用途不同。

要根据<form>表单提交数据的编码方式选择不同的方法。

request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次
比如:
当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter() 方法得到参数后,再调用request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用 request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。

当form表单内容采用enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,所以这时调用request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,即使已经调用了 request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得 到表单中的数据,而request.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用就会抛异常。

你以为到这就结束了吗?no 

小左在开发小程序时,用到了swagger作为api接口开发文档,及测试,不知道用过的朋友们发现了这个没,

我们发现swagger测试时上传参数也是 application/json这种方式,这种方式提交的参数在springmvc中都是无法直接映射的,既然遇到了这种问题,如果你还想直接映射,是否有解决方案呢?

不知道大家有啥好的法子,反正小左是直接改变content-type的设置。

那么是如何设置的呢

swagger的解决方案:
非常简单,我们的swagger有个注解是设置方法操作类型的。

@ApiOperation(value="接口说明(测试)",httpMethod="Post",consumes="application/x-www-form-urlencoded",notes="在没有会话、没有签名的情况下,进入方法体")
解决了swagger,重点是小程序,毕竟swagger是做测试的,不是重点呀!

其实也很简单,我们只需要在小程序中发送post的请求中设置头信息就可以了

 

  header: {
        "Content-Type":"application/x-www-form-urlencoded"
      },
至此,小左的理解就到这儿了,理解 的很浅,希望大佬们多给点见解!

参考文档:https://www.cnblogs.com/jimmy-muyuan/p/5294654.html

https://www.cnblogs.com/xmplatform/p/5785065.html




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值