文章目录
一、简易版web 服务
我们访问一个网页,最常用的方法就是输入网址之后回车,等待浏览器返回一个界面,展示给我们
那么,这个过程中发生了什么事情,能够让浏览器返回界面呢
- 浏览器要朝服务器发送请求;
- 服务器收到请求;
- 服务器根据请求的内容返回给浏览器响应的内容;
- 浏览器收到响应的内容,然后根据某些特定的规则,将内容渲染成页面,展示给用户
简单的演示代码
服务端:
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 就是它,在bind前加
server.bind(('127.0.0.1',8081))
server.listen(2)
while True:
conn, addr = server.accept()
data = conn.recv(1024)
print(data)
conn.send(b'hello baby~')
conn.close()
客户端:
客户端这里我们直接使用浏览器,对(‘127.0.0.1’,8080) 发送请求
结果展示:
先启动服务端,再使用浏览器发送请求
浏览器访问
对于服务端,收到了来自浏览器的请求
1.1 浏览器界面分析
在服务端部分,我们能够确定一点,浏览器的确向服务端发送了请求。
但是服务端向客户端发送的数据并没有被浏览器正常接受,所以会显示
区分服务端断开连接,浏览器的反应
1.2 问题分析
浏览器可以作为很多不同服务端的客户端,所以,对于不同的服务端发送来的消息,需要做到下面两点中的其中一点:
要求浏览器能够识别不同服务端的消息,并且针对性的进行处理;
将服务端发送的消息按照统一的标准,处理之后,再发送给浏览器;
很明显第二种方案,更加的符合实际。这个统一的标准其实就是 HTTP 协议!
二、HTTP 协议
2.1 协议介绍
HTTP 协议:超文本传输协议,用来规定服务端和客户端之间数据交互的格式,当客户端是浏览器时,必须要遵循这个协议。
其实,该协议对于程序开发来说,并不一定要遵循这个协议,当客户端是自己开发的 APP 时,可以自定义一个协议。
2.2 HTTP 协议的四大特性
基于请求响应
基于 TCP/IP 作用于应用层上的协议
无状态:不保存用户的信息( 由于该特性的存在,出现了专门记录用户状态的技术–cookie, seesion, token… )
无链接/短连接 :请求来一次就响应一次,之后就没有任何链接和关系了,即链接断开
( 微信和 QQ 这种需要保存链接状态的情况,需要长链接:建立连接后默认不断开-----websocket )
2.3 请求数据格式
请求头:标识 HTTP 协议的版本,请求方式
请求首行:一大堆 K,V 键值对
/r/n-----注意:/r/n 不可忽略
请求体: 只有 POST 请求有,里面会存放POST 请求提交的敏感数据
请求方式
- GET 请求:朝服务端要数据
eg: 输入网址,获取内容
- POST 请求:朝服务端提交数据
eg: 用户登录功能,输入用户名和密码,提交到服务端进行身份验证
2.4 响应数据格式
响应头:标识 HTTP 协议的版本,响应状态码
响应首行:一大堆 K,V 键值对
/r/n-----注意:/r/n 不可忽略
响应体: 返回给浏览器展示给用户看的数据
响应状态码
用简单的数字来表示一些复杂的状态或者描述信息
1xx : 存在的状态很短—服务端成功接受了数据,可以继续提交数据
2xx : 服务端成功响应了你想要的数据( eg: 200 OK )
3xx : 重定向(eg: 想要访问一个页面但是直接跳转到登录界面 )
4xx : 请求错误(404:请求资源不存在;403:当前请求不合法,或没有访问的条件)
5xx : 服务器内部错误 (服务器出问题了)
三 http请求协议与响应协议
http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字 文本。
3.1 请求协议
请求方式: get与post请求
-
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
-
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
-
GET与POST请求在服务端获取请求数据方式不同。
请求首行中的字段
**在 Django 中可以通过request对象的request.META
方法取出 HTTP首行的所有内容 **
1 CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
2 CONTENT_TYPE —— 请求的正文的MIME 类型。
3 HTTP_ACCEPT —— 响应可接收的Content-Type。
4 HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
5 HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
6 HTTP_HOST —— 客服端发送的HTTP Host 头部。
7HTTP_REFERER —— Referring 页面。
8 HTTP_USER_AGENT —— 客户端的user-agent 字符串。
9 QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
10 REMOTE_ADDR —— 客户端的IP 地址。
11 REMOTE_HOST —— 客户端的主机名。
12 REMOTE_USER —— 服务器认证后的用户。
13 REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
14 SERVER_NAME —— 服务器的主机名。
15 SE0RVER_PORT —— 服务器的端口(是一个字符串)
**从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。
所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。 **
请求类型
**请求头中的Content-Type
规定,请求格式 **
form-data
可以穿普通数据和文件
urlencoded
普通类型的数据
application/json
JSON 格式数据
3.2 响应协议
响应格式
3.3 响应状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
301 暂时重定向
302 永久重定向
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
3.4 响应类型
**针对于响应体也同样分为很多格式:这些格式是为了将相应体中传来的数据以什么样的格式展示 **
可以渲染成 HTML 文件,也可以只当做 JSON 类型的数据展示