本文转载自多篇文章,在这里记录一下。

request的Content-Type小结

application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型。Servlet API规范中对该类型的请求内容提供了request.getParameter()方法来获取请求参数值。但当请求内容不是该类型时,需要调用request.getInputStream()或request.getReader()方法来获取请求内容值。

当请求体内容(注意:get请求没有请求体)类型是application/x- www-form-urlencoded时也可以直接调用request.getInputStream()或request.getReader()方法获取到请求内容再解析出具体都参数,但前提是还没调用request.getParameter()方法。此时当request.getInputStream()或request.getReader()获取到请求内容后,无法再调request.getParameter()获取请求内容。即对该类型的请求,三个方法互斥,只能调其中一个。今天遇到一个Controller请求经过Spring MVC 的RequestMapping处理后,只能通过request.getParameter()获取到参数、无法通过request.getInputStream()和request.getReader()读取内容很可能就是因为在请求经过Spring MVC时已调用过request.getParameter()方法的原因。

注意:在一个请求链中,请求对象被前面对象方法中调用request.getInputStream()或request.getReader()获取过内容后,后面的对象方法里再调用这两个方法也无法获取到客户端请求的内容,但是调用request.getParameter()方法获取过内容后,后面的对象方法里依然可以调用它获取到参数的内容。

当请求体内容是其它类型时,比如 multipart/form-data或application/json时,无法通过request.getParameter()获取到请求内容,此时只能通过request.getInputStream()和request.getReader()方法获取请求内容,此时调用request.getParameter()也不会影响第一次调用request.getInputStream()或request.getReader()获取到请求内容。

request.getInputStream()返回请求内容字节流,多用于文件上传,request.getReader()是对前者返回内容的封装,可以让调用者更方便字符内容的处理(不用自己先获取字节流再做字符流的转换操作)。

=========================================

最近做项目时,发现手机客户端通过http协议post方式上传数据到服务端,在服务器端通过request.getInputStream()能获取到相应的数据,但用request.getParameter()却获取不到数据。这是怎么回事呢,后来发现这种情况跟form表单的属性 enctype有关系。 
HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data。

1、enctype=”application/x-www-form-urlencoded”是默认的编码方式,当以这种方式提交数据时,HTTP报文中的内容是: 
Html代码 收藏代码 
POST /post_test.php HTTP/1.1 
Accept-Language: zh-CN 
User-Agent: Mozilla/4.0 
Content-Type: application/x-www-form-urlencoded 
Host: 192.168.12.102 
Content-Length: 42 
Connection: Keep-Alive 
Cache-Control: no-cache

title=test&content=%B3%AC%BC%B6%C5%AE%C9%FA&submit=post+article

Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

2、在传输大数据量的二进制数据时,必须将编码方式设置成enctype=”multipart/form-data”,当以这种方式提交数据时,HTTP报文中的内容是:

Html代码 收藏代码 
POST /post_test.php?t=1 HTTP/1.1 
Accept-Language: zh-CN 
User-Agent: Mozilla/4.0 
Content-Type: multipart/form-data; boundary=—————————7dbf514701e8 
Accept-Encoding: gzip, deflate 
Host: 192.168.12.102 
Content-Length: 345 
Connection: Keep-Alive 
Cache-Control: no-cache

—————————–7dbf514701e8 
Content-Disposition: form-data; name=”title” 
test 
—————————–7dbf514701e8 
Content-Disposition: form-data; name=”content” 
…. 
—————————–7dbf514701e8 
Content-Disposition: form-data; name=”submit” 
post article 
—————————–7dbf514701e8– 
如果以这种方式提交数据就要用request.getInputStream()或request.getReader()来获取提交的数据 ,用 request.getParameter()是获取不到提交的数据的。

最后注意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.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用会抛异常的。

============================

最近项目业务涉及到服务端(Java)与服务端(c++)通信,我是属于java端,c++端通过拼接http请求头向java端发送数据。发现数据可以接收到,但是数据里如果出现+号会将+号转义为空格。经排查发现是因为请求头的Content-Type属性为application/x-www-form-urlencoded,这样会导致url加密,从而将特殊字符转义使得收到的参数不够准确。所以Content-Type 就不能再使用application/x-www-form-urlencoded类型。应改为text/html或text/plain来避免将特殊字符串转义。但是如此一来发送的参数就不是form键值对的形式了。java端无法用传统的接收方法来接收。这个时候就要直接从request的输入流中去取参数。代码如下:

//获取post参数 
StringBuffer sb = new StringBuffer() ; 
InputStream is = request.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is);   
BufferedReader br = new BufferedReader(isr); 
String s = "" ; 
while((s=br.readLine())!=null){ 
sb.append(s) ; 

String str =sb.toString();
--------------------- 
作者:当时年少春衫薄丶 
来源:CSDN 
原文:https://blog.csdn.net/cxfly957/article/details/78785498?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

[web] request的Content-Type小结相关推荐

  1. Spring Boot——[Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]解决方案

    问题描述 2020-02-13 19:32:04.322 WARN 109508 --- [p-nio-80-exec-4] .m.m.a.ExceptionHandlerExceptionResol ...

  2. 报错Content type ‘multipart/form-data;boundary=----WebKitFormBoundaryTz0sivpVO7U0H70m;charset=UTF-8‘ n

    最近在做一个图片上传,遇到这了这种情况,在入参 body 中同时传入文件和其它参数信息结果出现如题异常. 特别在此记录解决办法,以供大家参考. method="post"必须事po ...

  3. HttpMediaTypeNotSupportedException: Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ n

    问题如下: Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'applicatio ...

  4. Media Type 媒体类型(MIME Type、Content Type)

    媒体类型用于声明随之而来的数据的格式.又称:MIME类型.MIME Type.Content Type. 是一种用于在异构系统.分布式网络之间声明并传递信息主体格式的方法. 一般的,在文件系统中,我们 ...

  5. restTemplate http请求报错:no suitable HttpMessageConverter found for response type and content type

    报错信息: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no sui ...

  6. sendData to ABAP backend via multiple form content type

    Created by Jerry Wang, last modified on Aug 20, 2014 使用multipart/form-data的content type通过Javascript向 ...

  7. “Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“解决方法

    项目接口返回 code: 500 data: null message: "Content type 'application/x-www-form-urlencoded;charset=U ...

  8. SharePoint2010 内容类型剖析(Content Type/ 內容類型)

    原文地址:http://sharepoint410.wordpress.com/2011/01/06/sharepoint2010-%E5%86%85%E5%AE%B9%E7%B1%BB%E5%9E% ...

  9. Sharepoint学习笔记—ECM系列—找不到Content Type Publishing链接

    在调试Sharepoint2010内容管理部分时进入到某网站集的管理界面,发现找不到Content Type Publishing链接.于是就有了下面的知识点 并不是所有的Site Template都 ...

  10. Error while extracting response for type [class xxx] and content type application/xml;charset=UTF-8

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 最近在用restTemplate进行一次http请求时发现了报错(Error whil ...

最新文章

  1. JAVA共通関数--文字列に空白を追加する
  2. MySQL数据库 Too many connections
  3. C++使用ADO存取图片
  4. cacti 被监控机器snmp 配置
  5. c3p0依赖导入失败问题
  6. java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除
  7. android 屏蔽快速点击,Android-如何防止用户过快频繁点击按钮(一)
  8. 如何在计算机中找到桌面这个项,怎样找到“计算机管理”这项菜单?
  9. 华为onu 调为交换机_华为onu命令及操作步骤
  10. 别觉得自己PS很牛,看完这位俄罗斯大神作品后,会觉得只是小牛牛
  11. OneNote for windows10 微软商店下载UWP版本应用打不开
  12. 可视化实验四:大数据可视化工具—ECharts(二)
  13. c语言顺序结构和选择结构
  14. cannot import name ‘artist‘ from ‘matplotlib‘
  15. php addslash,php addslashes用法详解
  16. JavaEE初阶---网络原理初识+网络编程套接字+网络原理之TCP_IP
  17. SAP 公司间销售配置原理和步骤
  18. jpg转pdf文件转换器注册码
  19. LINUX系统下部署百度离线地图开发API
  20. RabbitMQ之订阅模式与主题模式,消息确认机制

热门文章

  1. STM32F411核心板固件库开发(四) ADC配置
  2. [论文笔记] 大型车牌检测数据集CCPD 阅读笔记
  3. mysql 唯一约束_Mysql 唯一性约束添加
  4. web performance tu ning
  5. 高级软件工程第九次作业:东理三剑客团队作业-随笔5
  6. JS 高级(二)闭包、封装
  7. 人生只有一件事:坚持正确改正错误
  8. 1.12 Illustrator视图的打印拼贴 [Illustrator CC教程]
  9. 数学3大分支:代数、几何、分析 //转载
  10. 和利时scada系统服务器参数,设备数据采集之SCADA系统