一 HTTP概述
HTTP (hypertext transport portrol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规定。
HTTP就是一个通行规则,通信规则规定了客户端发送给服务器的格式,也规定了服务器发送给客户端的内容格式。其实我们要学习就是这两个格式。
特点:
- HTTP 叫超文本传输协议,基于请求/响应模式的!
- HTTP 是无状态协议
二 请求协议
请求协议格式如下:
- 请求头 //请求方式,请求路径 协议和版本 例如:GET/index.html HTTP/1.1
- 请求头信息 // 请求头名称:请求头内容, 即为 key:value 格式 例如:Host:localhost
- 空行:用来与请求体分开
- 请求体: GET没有请求体,只有POST有请求体
浏览器发送给服务器的内容就这个格式,如果不是这个格式服务器将无法解读!在HTTP协议中,请求有很多请求方法,其中最常见的是GET和POST。不同的请求方法之间有区别,后面介绍
2.1 GET 请求
HTTP默认的请求方法是GET
*没有请求体
*数据必须在1K之内
*GET请求数据会暴露在浏览器的地址栏只能中
GET 请求常用的操作
1.在浏览器的地址栏中直接给出URL,那么久一定是GET请求
2.点击页面上的超链接也一定是GET请求
3.提交表单时间,表单么哦人使用GET请求,但可以设置为POST
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36
Name
login/
requests ❘ 737 B transferred ❘ Finish: 5 ms ❘ DOMContentLoaded: 14 ms ❘ Load: 14 ms
*GET 127.0.0.1:8090/login HTTP/1.1:GET请求,请求服务器127.0.0.1/login 协议为1.1
- Host :localHost :请求的主机名为LocalHolst
- User-Agent:Mozilla/5.0(Windows NT5.1;rv50)
- Accept:text/htmo,aplication/xhtml+xml,applixation/xml;q=0.9,/,1=0.8,告诉服务器,当前客户端可以接收的文档类型,其实这里包含了/,就表示什么都可以接收;
- Accept-Language:zh-CN,zh;q=0.8
当前客户端支持的语言,可以在浏览器的工具口选项中找到的语言相关信息。 - Accept-Encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,可能服务器会吧数据压缩后在发送。
- ccept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客户端支持的编码。
- Connection:kep- alive 客户端支持的链接方式,保持一段时间链接,默认为3000ms
- Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:
因为不是第一次访问这个地址,所以会在请求中吧上一次服务器响应中发过来的Cookie 在请求中一并发送过去;这个Cookie的名字为JSESSIONID
注意
- HTTP无状态:无状态是值协议对于事物没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开的这个服务器上的网页之间没有任何联系。
*如果你要实现一个购物车,需要借助Cookie或Session来记忆或服务器端API 记录这些信息,请求服务器结算页面同时将这些信息提交到服务器。
*但等你登陆到一个网站时,你的登陆状态是由Cookie 或者Session来记忆的,以为服务器并不知道你是否登陆。
优点:服务器不在用为每个客户端链接分配内存来记忆大量状态,业不用在客户端失去链接时去清理内存,以更高效的去处理WEB业务。
缺点:客户端的每次请求都需要携带相应参数,服务器需要处理这些参数。
容易犯的错误:
- 1 HTTP 是一个无状态的面相连接的协议,无状态不代表HTTP不能保持TCP链接,更不能代表HTTP使用的是UDP协议
- 2 从HTTP/1.1 起,默认都开起了Keep-Alive ,保持链接性,简单的说,当一个网页打开完成后,客户端和服务器之间用于传输。
HTTP 数据的Tcp 链接不会冠词,如果客户端再次访问这个服务器删的网页,会继续使用这一条已经建立的链接
-3 Keep-alive 不会永久保持链接,它有一个保持时间,可以在不同饿服务器软件中这只这个时间。
2.2 Post请求
1.数据不会出现在地址栏中
2.数据的大小没有上限
3.有请求体
4.请求体中如果有中文,会使用URL 编码
- 注意 为什么要使用url编码
我们都知道HTTP协议中传输的是“key = value”这种键值对形式的,如果要传多个参数要使用&符号对键值对进行分割。这样在服务器端收到这种字符串的时候,就会“&”分割出每一个参数,然后在用 =号来分割出参数
使用表单可以发起POST 请求,但是表单默认是GET
<from action ="" method = "pot">
</from>
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:13
Content-Type:application/x-www-form-urlencoded
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Origin:http://127.0.0.1:8090
Pragma:no-cache
Referer:http://127.0.0.1:8090/login/
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36
Form Data
username:yuan
POST 请求是可以有请求体的,而GET请求不能有请求体。
- Referer: //127.0.0.1:8090/login/index.jsp: 请求来自哪个页面,例如你在百度删点击链接到了这里,那么Refer:http//www.baidu.com ;
如果你是在浏览器的地址栏中直接输入的地址,那么久没有referer 这个请求头来;
*content_type :application/x-www-from -urlencoded :表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以“%”为前缀后面跟随两位16进制 eg.username=%E5%BC%A0%E4%B8%89&password=123
*Content-length:13 请求体的长度,这里表示13个字节
*keyword = hello :请求体内容!hello 是在表单中输入的数据,keyword是表单字段的名字。
注释:
*referer 请求头是比较有用的一个请求头,它可以用来做统计工作,页可以用来做防盗链。
统计工作:我们公司在百度上做了广告,但不知道在百度上做广告对我们网站的访问量是否有影响,那么可以对每个请求中的Referer进行分析,如果Referer 为百度的很多,那么说明用户都是通过百度找到我们公司网站的。
防盗链:我们公司网站上有一个下载链接,其他网站盗链链这个地址,,例如我们网站上的index.html页面中有一个链接,点击可下载JDK,但是有人的微博中盗链链这个资源,它也有一个链只想我们的网站JDK,页就是说登陆它的微博,点链接就可以从我们网站删下载JDK,这导致我们网站的广告没有看,但下载的却是我们网站的资源,这是可以使用Referer进行防盗链,在资源被下载之前,我们对Referer进行判断,如果请求来自本网站,那么允许下载,如果非网站,先跳转到本网站看广告,然后再允许下载。
三 响应协议
响应协议格式如下:
*响应首行
*响应头信息
*空行
*响应体
响应内容是由服务器发送给浏览起的内容,浏览起会更具响应内容来显示。遇到<img src ="">会开一个新的线程加载,所以有时图片多的话,内容会先显示出来,然后图片才一张张加载出来。
Request URL:http://127.0.0.1:8090/login/
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8090
Response Headers
view source
Content-Type:text/html; charset=utf-8
Date:Wed, 26 Oct 2016 06:48:50 GMT
Server:WSGIServer/0.2 CPython/3.5.2
X-Frame-Options:SAMEORIGIN
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
用户名:<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
*HTTP/1.1 200OK :响应协议为HTTP1.1 ,状态码200表示请求成功,OK是对状态码的解释;
*Server:WSGIServer/0.2 python/3.5.2;服务器版本信息
*Content-type :text/html;charset =utf8 响应使用的编码为utf8
*Content-Length:724;响应体为724字节
*Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie;
*Date: Wed, 25 Sep 2018 04:15:03 GMT:响应的时间,这可能会有8小时的时区差;
3.2 状态码
响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功,302表示重定向,这说明浏览器需要再发一个新的请求。
*200 :请求成功,浏览器会吧响应内容(同城html)显示在浏览器中;
*404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
-
500: 请求资源找到了,但服务器内部出现了错误。
*304 当用户第一次请求index.html时,服务器会添加一个名为Last-Modified响应头,这个头说明了index.html的最后修改时间,浏览器会吧index.html内容,以及最响应时间缓存下来。当用户第二次请求index.html时,在请求汇总包含一个名为If-Modeified-Scene请求头,它的值就是第一次请求时服务器通过Last-modified响应头发送给浏览器的值,即index.html最后修改时间,If-modeified-secen请求头就是在告诉服务器,我这里浏览器缓存的indext.html最后修改时间是这个,你现在看看现在的index.html足后修改时间是不是这个,如果还是,那么你就不用在响应这个index。html内容了,我会吧缓存的内容直接显示出来。而如武器端会获取if-modeified-since值,与index。html的当前最后修改时间比较,如果相同,服务器会发响应码304,表示index与浏览器上次缓存的相同,无需再次发送,浏览器就显示自己的缓存页面,如果比对不同,那么说明index。html已经做了修改,服务器响应200. image.png
*302 :重定向,当响应码为302时,表示服务器要求浏览器重新发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址。
3.3 其他响应头
告诉浏览器不要缓存的响应头
*Expires:-1
*Cache-control:no-cache
*Pragma:no-cache;
自动刷新响应头,浏览器会在3秒之后请
*Refresh:3 ;url=http:www.baidu.con
3.4HTML中指定响应头
在HTML页面中可以使用<meta http-equiv="" content="">指定响应头,例如在index.html页面中给出<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">,表示浏览器只会显示index.html页面3秒,然后自动跳转到http://www.baidu.com.
网友评论