简介
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 服务器处理请求出错