关于http请求传参的总结
get post 获取url上的参数QueryString(),能否取到值。能否
论contentType
仅在contentType是application/x-www-form-
教育类网站模板urlencoded时可以
获取请求体中的字节流InputStream() /
否能
1、QueryString()只能获取GET请求的参数,即URL中的QueryString参数;InputStream() / Reader()只能获取POST请求的参数,即请求体的参数。且请求体中的数据仅能调⽤ InputStream(), Reader()和Parameter("key") ⽅
法读取⼀次,即仅第⼀次能读到数据,后⾯读到的数据为null。
2、什么时候可以通过Parameter()获取参数值
(1)、所有get请求
(2)、contentType是application/x-www-form-urlencoded的post请求
tomcat只会对Get请求和Content-Type是application/x-www-form-urlencoded的POST请求的参数进⾏相应处理,即会解析表单数据到request parameter map 中。⽽其他类型的请求不做处理,所以其他类型的请求通过Parameter(name)是获取不到的
3、application/x-www-form-urlencoded 参数形式:field1=a&field2=b&field3=c
4、QueryString与请求体中有相同名称的参数,例如: /testServlet?name=a,接着⼜在请求体⾥附加name=b,然后post提交,这时候在后台Servlet调⽤Parameter("name");获取的是a还是b呢?
Tomcat解析Parameter的逻辑:parameter的name和value是⼀对多的关系,tomcat会先解析URI⾥的queryString,然后判断如果是post请求&&content-
type=”aplication/x-www-form-urlencoded”不管之前有没有获取到需要的参数都会去解析body,也就是说如果不是post请求⽽是delete或者其它请求或者content-type不是”aplication/x-www-form-urlencoded”则不会去读取body,这种情况getInputSteam可以读取body得到数据,可以⽤
5、GET⽅法,⽆论Content-Type是什么类型, 都会以请求参数的形式加在url后⾯。后台都可通过QueryString()参数串,此处有三种情况:
(1)、⾃⼰以&拼接请求参数字符串,后台可以通过QueryString()获取到contract=a&appKey=b请求参数,Parameter()同样可以正常取值
(2)、传递⼀个json对象,后台同样可以通过QueryString()获取到contract=a&appKey=b请求参数,Parameter()同样可以正常取值
(3)、将json对象转为json字符串之后传递,浏览器会将json字符串直接拼接到url后⾯,但是由于参数中含有特殊字符“{“,”}”以及引号,会报400错误。可以通过将参数进过⼀次编码后传输,后台通过QueryString()获取请求参数后解码可以得到String类型的json串。tomcat在解析参数到parameterMap时会将整个请求字符串作为key,value=“”存⼊。即Content-Type指定为application/x-www-form-urlencoded且参数形似field1=a&field2=b,tomcat才能正确将其处理⾄parameterMap
⼗分重要:从以上可以总结(此处不考虑有⽂件的情况),不论Content-Type的类型,不论,get或post请求,只要参数不是字符串类型,浏览器都会对参数
做field1=a&field2=b的处理,将参数转为此结构的字符串后传给服务端,所以有了5.(2)。但是如果参数本就是⼀串字符,浏览器便不会再对参数做处理,直接将原始字符串传到后台,get请求可以从QueryString中获取到原始字符串,post请求可以从请求体中取到原始字符串。
举个例子的表情包例若Content-Type指定为application/x-www-form-urlencoded,实际参数是⾮f ield1=a&field2=b格式的字符串,由于Content-Type是application/x-www-form-urlencoded类型,tomcat会将参数解析到ParameterMap,但此时格式⾮标准格式,在此例中,tomcat会将整个参数字符串作为key,value=“存
⼊ParameterMap,所以有了5.(3)。
在ajax中,可以通过指定processData:false来禁⽌浏览器对数据进⾏&形式的序列化,这个参数是jquery独有的,默认为true。默认情况下,发送的数据会被序列化,原⽣的XMLHttpRequest对数据的处理是⼿动并⽆这个参数。
源码:
s = jQuery.ajaxSetup( {}, options ),
// Convert data if not already a string
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param( s.data, s.traditional );
}
它会调⽤返回值:StringjQuery.param把{ width:1680, height:1050 }参数对象序列化为width=1680&height=1050这样的字符串。
6、Content-Type只是浏览器告诉后台如何去处理数据,并不会帮我们将请求参数转为Content-Type指定的类型,需要我们⾃⼰将Content-Type指定的类型与实际的参数形式对应起来。若你的Content-Type指定的是application/json,但是参数格式却不是json,浏览器不会帮你转为json格式,只是到了后台,发
现Content-Type是application/json,便以json格式来解析数据,但实际数据格式并⾮json,所以后台报错。
7、在向后台传输json数据(POST)时,且contentType:"application/json",在SpringMVC框架中我们可以通过@RequestBody注解在参数对象
上,SpringMVC会将从页⾯传递来参数set到⽤@RequestBody注解的对象上,我们直接拿对象⽤就可以了。原理即是SpringMVC从请求体中获取json字符串,然后将json字符串封装成我们需要的对象(猜想)。
8、关于请求中的Form Data、Request Payload区别
前端开发网页制作Request Payload:Content-Type不为application/x-www-form-urlencoded的请求,只要是Request Payload类型的参数,后台的数据都需要我们⾃⼰处
unstudio怎么读
理,tomcat并不会处理。
jquery下载文件请求Form Data:Content-Type为application/x-www-form-urlencoded的请求
Query String Parameters:所有get请求,⽆论Content-Type类型
9、contentType:multipart/form-data参数的请求,只⽀持post请求,tomcat不作处理,⽆法通过Parameter("name")取值,需要⾃⼰解析通过InputStream()获取请求体数据进⾏解析,在springMVC中我们只需要配置⼀个⽂件处理器类就可以帮我们处理再传⼊到Controller中了。例如常⽤的CommonsMultipartResolver
下载linux操作系统的网站10、关于ajax不能下载⽂件问题
ajax的返回值类型是json,text,html,xml类型,或者说ajax的接收类型只能是string字符串,不是流类型,所以⽆法实现⽂件下载。但⽤ajax仍然可以获得⽂件的内容,该⽂件将被保留在内存中,⽆法将⽂件保存到磁盘。这是因为JavaScript⽆法和磁盘进⾏交互,否则这会是⼀个严重的安全问题,说⽩点就是js⽆法调⽤到浏览器的下载处理机制和程序。所以我们要实现ajax下载,不能够使⽤相应的ajax函数进⾏⽂件下载。但可以⽤js⽣成⼀个form,⽤这个form提交参数,并返回“流”类型的数据。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论