简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议,基于TCP/IP协议之上的应用层协议。
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP是一种不保存状态,即无状态(stateless)协议。自身不对请求和响应之间的通信状态进行保存。
限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
http协议包含:
- 请求协议,由浏览器发送数据到服务器需要遵循的
- 响应协议,与服务器发送数据到浏览器需要遵循的。
用于HTTP协议交互的信被为HTTP报文,由多行数据构成的字文本。请求端(客户端)的HTTP报文做请求报文,响应端(服务器端)的做响应报文。
请求协议
- 请求首行:方法(post和get),url,协议版本,get请求没有请求体。只有post请求才有。
- 请头部
- 请求体
请求协议就是一堆字符串,以\r\n 区分
,与请求体以\r\n\r\n
区分。
b’GET / HTTP/1.1\r\n
Host: 127.0.0.1:8880\r\n
Connection: keep-alive\r\n
…
Cookie:…\r\n\r\n’
请求方式: get与post请求
-
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连。
浏览器地址栏输入:127.0.0.1:8800/yuan?name=yuan&age=22
socket服务端打印接收data显示b'GET /yuan?name=yuan&age=22 HTTP/1.1\r\n
-
POST方法是把提交的数据放在HTTP包的Body中。
\r\n\r\nuser=bisheng&pwd=456'
-
GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
-
POST方法提交的数据没有限制。
-
GET与POST请求在服务端获取请求数据方式不同。
-
GET方式提交数据,会带来安全问题,通过GET方式提交数据时,用户名和密码将出现在URL上
-
一般查询操作用get,提交数据用post
模拟post请求
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8080" method="post">
用户名 <input type="text" name="user">
密码 <input type="password" name="pwd">
<input type="submit">
</form>
</body>
</html>
import socket
sock=socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(5)
while True:
conn,addr=sock.accept()
data=conn.recv(1024)
print(data) # 查看post请求
with open("login.html","rb") as f:
data=f.read()
conn.send(b"HTTP/1.1 200 OK\r\n\r\n %s" % data)
conn.close()
查看post请求,post请求,数据放在请求体中。
b'POST / HTTP/1.1\r\n
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Content-Length: 15\r\
...
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n
user=in&pwd=122' # 利用html中input name属性值拼接
响应协议
conn.send(b"HTTP/1.1 200 OK\r\n\r\n %s" % data)
- 响应首行
- 响应头
- 响应体:浏览器解析的文本内容
响应状态码
是当客户端向服务器端发送请求时, 返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。
- 1XX 请求正在处理
- 2XX 正常处理完毕
- 3XX 重定向:发送请求访问某个网址时,如果该网址换了地址,就会重定向跳转到新的网址,涉及到两次请求。
- 4XX 请求地址无法找到
- 5XX 服务器处理请求出错
1)301和302的区别。
301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取
(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301
2)重定向原因:
(1)网站调整(如改变网页目录结构);
(2)网页被移到一个新地址;
(3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的
网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
关于301与302