首页 > 编程知识 正文

HTTP协议中GET请求和POST请求

时间:2023-05-03 17:00:09 阅读:286189 作者:4996

一、HTTP协议

1. HTTP协议简介
  HTTP是一种通信协议,指架构在TCP/IP之上应用层的一种协议。

2. HTTP特性
它有两个基本但又极为重要的特性:

基于请求(request)/响应(response)模型无状态通信协议

HTTP是一种基于请求/响应的通信协议,客户端对服务器发出一个取得资源的请求,服务器将要求的资源响应给客户端,每次的联机只做一次请求/响应。在HTTP协议之下,服务器响应客户端之后,就不会记得客户端的信息,更不会维护与客户端有关的状态。

浏览器在使用HTTP发出请求时,有几种请求方式,如:GET、POST、HEAD、PUT、DELETE等,绝大数情况下只会使用GET和POST方法。


二、请求信息

1. 请求信息组成
  请求信息 = 请求行 + 请求头 + 请求体(只有post请求才会存在请求体信息)

2. 请求行
请求行 = 请求方式 + 请求的资源 + http协议的版本

请求方式:get / post请求资源:URLHttp协议的版本:HTTP/1.1

3. 请求头

Host: localhost:9090 (服务器的域名)Connection: keep-alive (网络连接是持久的)Content-Length: 12 (发送数据的大小, 单位字节)Cache-Control: max-age=0 (设置缓存数据的存活时间, 单位秒)Origin: http://localhost:9090 (指示了请求来自于哪个站点——服务器名称)Upgrade-Insecure-Requests: 1 (如果存在更安全的响应,客户端优先选择加密及带有身份验证的响应)Content-Type: application/x-www-form-urlencoded (发送数据的媒体类型 — 发挥作用类似后缀名:.mp3 .avi)User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 (当前客户使用的浏览器版本)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Referer: http://localhost:9090/day01/1.html(代表了来哪个页面)Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA

4. 请求体
  只有Post请求有

三、响应信息

1. 响应信息组成
  响应信息 = 状态行(响应行)+ 响应头 + 响应体

HTTP/1.1 200 ---------------- 响应行(状态行)Content-Length: 3Date: Sun, 26 Aug 2019 00:41:49 GMT -----响应头空行ABC 响应体内容 ---------------响应体

2. 响应行
  响应行 = 协议版本 + 状态码,例:HTTP/1.1 200

常见的响应状态码
  状态码的作用:代表了本次的请求服务器的响应状态(本次的请求是否成功)

1. 200 OK ------请求已成功,服务器通信正常。2. 302 Move temporarily -----设置重定向页面跳转的动作执行(页面发生跳转了)3. 304 Not Modified -----从浏览器缓存中读取数据,不从服务器重新获取数据4. 404 Not Found -----请求的资源不存在,url地址出错5. 405 Method Not Allowed 请求行中指定的请求方法不存在,例如发送post请求,服务器没有doPost方法,就会报这个错误6. 500 Internal Server Error ------服务器发生了错误,一般服务器代码错误

3. 响应头
  响应头的数据是响应给浏览器,可以设置响应头的数据,让浏览器按照我们指定的设置进行执行响应的功能。
  
常见响应头介绍:

Location: http://www.it315.org/index.jsp --跳转方向Server:apache tomcat--服务器型号Content-Encoding: gzip --数据压缩 Content-Length: 80 --数据长度Content-Language: zh-cn --语言环境Content-Type: text/html; charset=GB2312 --编码Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT--最后修改时间Refresh: 1;url=http://www.it315.org--定时跳转Content-Disposition: attachment; filename=aaa.zip--下载Set-Cookie:SS=Q0=5Lb_nQ; path=/searchExpires: -1--缓存Cache-Control: no-cache --缓存Pragma: no-cache --缓存Connection: close/Keep-Alive --连接Date: Tue, 11 Jul 2000 18:23:51 GMT--时间 refresh: 定时刷新跳转页面location:重定向操作,通常告知浏览器马上向该地址发送请求,与响应码302一起使用content-encoding: 设置当前数据的压缩格式,告知浏览器以何种压缩格式解压数据content-disposition: 通知浏览器以何种方式获取数据,直接解析数据(网页/图片文本)或者以附件方式(下载文件)content-type: 实体头部用于指示资源的MIME类型(MIME类型:用于提示当前文件的媒体类型,例如图片 — (image/png)、音频 —(audio/ogg))
四、GET请求

Get请求,顾名思义,就是向服务器取得的指定的资源。在发出Get请求时,必须一并告诉服务器所请求资源的URL、请求参数和标头信息等。URL的编码格式采用的是ASCII编码,而不是UNICODE,即是说所有的非ASCII字符都要编码之后再传输。一个Get请求的发送格式如下:

<HTTP方法:GET><请求的URL><请求参数><HTTP版本>
<请求标头>

请求参数通常是用户发送给服务器的必要信息,请求参数是在URL之后跟一个问号?,然后是请求参数名(name)和请求参数值(value),中间以等号(=)表示成对关系,若有多个请求参数,则以&字符连接。使用Get方式发送请求,浏览器的地址栏上会出现请求参数信息。

http://localhost:8080/test/login?username=abc&password=123456
五、Post请求

Post请求,顾名思义,就是在请求时发布信息给服务器,对于大量或复杂的信息发送(如:文件上传),基本都会采用Post方法。一个Post请求的发送格式如下:

<HTTP方法:POST><请求的URL><HTTP版本>
<请求标头>
<请求参数>

表面上看,Post只是将请求参数移至最后的信息体(Message Body)中,由于信息体的内容长度不受浏览器限制,所以大量数据的发送会使用Post方法,而且移至信息体后URL上不会出现请求参数。


六、选用 Get请求 or Post请求

从功能上:

Get请求的请求参数会出现在地址栏上,敏感性或有安全性考虑的请求参数(如:信用卡卡号、用户名、密码等),就不应该使用GET请求发送;

Get请求可以发送的请求参数长度有限(这个长度根据浏览器种类和版本而有所不同),对于数据量太大的数据并不适合用GET方式来请求;

Post请求的请求参数不会出现在地址栏上,所以无法加入浏览器的书签(Bookmark)之中,如果有些页面是根据请求参数来作不同的画面呈现(如:论坛的文章发表),而你希望可以让用户设定书签,则应该使用GET请求。

POST和GET方式的安全性是相对的,另外也要看是从哪个角度来看。从数据传输过程方面来看,POST方式是更加安全的,但是从对服务器数据的操作来看,POST方式的安全性又是比较低的。即使是传输过程用POST来执行,安全性也是相对的,如果了解HTTP协议漏洞,通过拦截发送的数据包,同样可以修改交互数据,所以这里的安全不是绝对的。

从非功能性上:

Get请求应该用于等幂操作。Get请求纯粹取得资源,而不改变服务器上的数据或者状态。Get的请求参数,只是用来告知服务器,必须进一步根据请求参数(而不是url)来标识出要响应的内容(如查询数据库数据),同样的Get请求使用相同的参数使用多次,都应该传回相同的结果;

Post请求应该用于非等幂操作。Post请求发送的数据,可能会影响服务器上的数据或状态,例如修改(增、删)数据库的内容,或是在服务器上保存文件,你的请求若会改变服务器的状态,则应该使用Post请求。

是否为等幂操作,就是请求的操作是否改变服务器的状态,即同一个操作重复多次,是否传回同样的结果。


七、Get请求 和 Post请求 的区别

面试回答:

GET在浏览器回退时是无害的,而POST会再次提交请求;GET产生的URL地址可以被Bookmark,而POST不可以;GET请求会被浏览器主动cache,而POST不会,除非手动设置;GET请求只能进行url编码,而POST支持多种编码方式;GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;GET请求在URL中传送的参数是有长度限制的,而POST么有;对参数的数据类型,GET只接受ASCII字符,而POST没有限制;GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

GET和POST两种基本请求方法的区别


八、默认请求方式

一般在浏览器输入一个网址直接访问网站,默认都是GET请求。而在<form>表单中,默认也是GET提交方式,但可以通过设置method属性指定提交方式为GET或者POST。在解决请求信息乱码时,GET请求无需处理,只有POST请求才存在乱码,通过过滤器设置POST请求解决项目请求乱码问题。

if("post".equalsIgnoreCase(method)){ request.setCharacterEncoding("UTF-8"); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。