一,http协议简介
超文本传输协议,提供一种发布和接受HTML页面的方法。
其中我们应该知道的是两个协议格式。客户端发送到服务器的请求协议,服务器发送给客户端的响应协议。
http的特点是:
http是基于请求/响应模式的
http是无状态协议
(http是一个客户端服务端请求和应答标准,默认端口都为80端口)
URL:统一资源定位器,它包括: 协议名://域名:端口/路径。
二,请求协议
请求协议的格式:
请求首行://请求方式,请求路径,协议版本。GET方式 /favicon.ico路径 HTTP/1.1协议版本
请求头信息://请求头名称:请求头内容,即为key:value键值对格式 Host: 127.0.0.1:9000
空行://用来与请求体分隔开
请求体://get方式没有请求体,POST方式有请求体
2,GET请求
HTTP默认的请求方法是GET
没有请求体
数据必须在1K内
GET请求数据会暴露在浏览器的地址栏中
GET请求常用操作:
1.在浏览器的地址栏中直接给出URL
2.点击页面上道德超链接也一定是GET请求
3.提交表单是,表单默认使用GET请求,也可设置为POST方式
GET操作的集体信息
GET 127.0.0.1:8090/login HTTP/1.1:GET请求,请求服务器路径为 127.0.0.1:8090/login ,协议为1.1;
Host:localhost:请求的主机名为localhost;
*User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告诉服务器,当前客户端可以接收的文档类型,其实这里包含了*/*,就表示什么都可以接收;
Accept-Language: zh-cn,zh;q=0.5:当前客户端支持的语言,可以在浏览器的工具选项中找到语言相关信息;
Accept-Encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客户端支持的编码;
Connection: keep-alive:客户端支持的链接方式,保持一段时间链接,默认为3000ms;
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因为不是第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过;这个Cookie的名字为JSESSIONID。
3,POST请求
post请求的特点:
数据不会出现在地址栏中
数据的大小没有上限
有请求体
请求体中如果存在中文,会使用URL编码
http协议中参数的传递是使用键值对的方式进行传输,如果有多个键值对情况下需要用&进行分割。这样服务端在收到这样的的字符串的时候会先使用&进行分割键值对然后使用=分割参数值。
POST请求是可以有体的,而GET请求不能有请求体。
- Referer: http://localhost:8080/hello/index.jsp:请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;
- Content-Type: application/x-www-form-urlencoded:表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以“%”为前缀,后面跟随两位的16进制。
- Content-Length:13:请求体的长度,这里表示13个字节。
- keyword=hello:请求体内容!hello是在表单中输入的数据,keyword是表单字段的名字。
Referer头的使用,可以统计网站访问信息,可以用来防盗链。
三,响应协议
响应协议格式:
响应首行
响应头信息
空行
响应体
响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。遇到<img src=''>会开一个新的线程加载,所以有时图片多的话,内容会先显示出来,然后图片才一张张加载出来
- HTTP/1.1 200 OK:响应协议为HTTP1.1,状态码为201,表示请求成功,OK是对状态码的解释;
- Server:WSGIServer/0.2 CPython/3.5.2:服务器的版本信息;
- Content-Type: text/html;charset=UTF-8:响应体使用的编码为UTF-8;
- Content-Length: 724:响应体为724字节;
- Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie;
3.2 状态码
响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求。
- 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
- 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
- 500:请求资源找到了,但服务器内部出现了错误;
- 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
- 解析状态码在HTTP中的应用
一个简单的服务端示例代码:
#服务端代码示例 import socket sock = socket.socket() sock.bind(("127.0.0.1",9000)) sock.listen(5) while True: conn,addr = sock.accept() data=conn.recv(1024) print(data.decode("utf8")) with open("server_test.html",encoding="utf8") as f: data=f.read() conn.send(b"HTTP/1.1 201 OK %s" %data.encode("utf8")) conn.close() #服务端html页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>这是一个测试段</title> </head> <h1>测试语句</h1> <body>测试段内容,显示信息确认页面读取正常<br> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495439831&di=36446826d88460cfa0c7662d8bac6e1a&imgtype=jpg&er=1&src=http%3A%2F%2F5.26923.com%2Fdownload%2Fpic%2F000%2F322%2F855cf0bca1a9b9e3067b8a575b430f26.jpg"> </body> </html>
http传输协议传输数据都是bytes数据,一定要注意文件读取时编解码问题。