HTTP get post

HTTP协议中最常用的两个请求方法get、post

HTTP请求格式

<request-line>

<headers>

<blank-line>

[<request-body>]

<request-line> 的格式为 METHOD REQUEST-URI VERSION  回车换行符

headers 可以有多行,每行的格式为name:value1[,value2,...value n]后跟回车换行符

<blank-line>的作用是标示headers结束,此行只能有一个回车换行符

<request-body>在POST请求的时候会有数据,GET方法request-body为空

HTTP响应格式

<status-line>

<headers>

<blank-line>

<response-body>

<status-line>  格式为 VERSION STATUS-CODE STATUS-TEXT

GET和POST请求的区别

①按照HTTP协议规范,get用来获取信息,post则用来修改信息,所以按照规范,get请求应该是不会对服务器上的数据产生影响,但是实际使用中,可能并不是那么严格的遵守此规范。

②get请求和post请求的长度问题,按照HTTP协议,get和post长度并没有限制,我们常说的get适合传送销量信息,主要是因为get请求将queryString追加在url中,然而不同的浏览器对url的长度限制不一,导致了get请求的信息量较小,其实服务器也会对url长度作限制,如果长度过长会报414错误

③queryString位置不同,get请求queryString是在request-line中,post则是在request-body中

④安全性,get请求中的参数会在url中明文显示,而URL会被浏览器缓存,而POST方式的请求,queryString是在request-body中

⑤编码问题

        get请求中提交的数据默认是不能指定urlencode的编码格式,一般按照浏览器设置,中文的浏览器上一般都是GBK或UTF-8,由于URL拼接完成后,浏览器会对URL进行encode,将不符合浏览器规范的字符按照指定的编码方式编码成二进制字节码,按照%xy的形式拼接在url中,比如刚看到的某文章中的“严”字,UTF-8的编码为E4B8A4,那么按照UTF-8编码encode之后就变成了%E4%B8%A5,这样就符合URL的规范啦。由于不同浏览器的设置不同,为了方便后台解码,可以使用javascript中的encodeURI、encodeURIComponent方法进行encode,这两个方法使用的编码方式为UTF-8。服务器接收到请求的URL后,按照自身设定的编码方式进行URL encode,像tomcat默认的是ISO-8859-1,所以,get请求中含有中文的话,很可能会出错,我们需要修改配置文件(当然也可以在doGet方法里面自己转码),来指定tomcat的decode编码格式

 <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>  

需要注意的是,request.setCharacterEncoding方法,并不能对get请求起作用,Servlet的文档中也说啦,该方法进队request body中的encoding有效,而get方法是没有请求体的。

        对于post请求来说,则显得灵活很多,因为只要页面中有下面这段内容,那么form中的数据就会按照指定的编码进行encode啦,另外这段内容还可以控制浏览器显示页面时候使用的编码方式。

<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>

 服务器端接收到之后会使用默认的编码进行decode,但是这个时候就可以使用request.setCharacterEncoding("字符集")进行设定啦。另外需要注意的是,post传递参数可以在uri中,也可以在request-body中,所以,对于uri中的中文等特殊字符,还是需要像get请求那样去处理的。

猜你喜欢

转载自shidan66.iteye.com/blog/2009341
今日推荐