HTTP是浏览器客户端与网页服务端的一种链接协议,是基于短TCP链接。客户端发的HTTP请求分为两部分,一部分是HTTP Header(头),一部分是HTTP Body(身体)。在说Header与Body的区别之前需要理解HTTP的主要的两种请求方式,一种是GET一种是POST。
# GET 的请求头 GET / HTTP/1.1 Host: website.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: no-cache Cache-Control: no-cache # POST 的请求头 POST / HTTP/1.1 Host: website.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: no-cache Cache-Control: no-cache pwd=1212&usr=1212我们可以看到每个请求头都第一个词就是“POST”或者,“GET”。 接下来就是一个“/”号。这个是请求网页的路径,比如说如果我请求 csdn.net/this/that/thatthat 的话我的路径就会是/this/that/thatthat。 当服务器接收到了请求之后会回应一个HttpResponse
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed <h1>Hello World</h1>第一行的 200 OK 是一个CGI号码。200代表正常,300代表redirect, 500代表内部服务器问题等等等等。。。
现在我有一段代码,可以接受HTTP请求,但是不回复任何信息。
import socket s = socket.socket() s.bind(('127.0.0.1', 8000)) s.listen(5) while True: conn, addr = s.accept() print(conn.recv(512).decode())输出如下
GET / HTTP/1.1 Host: 127.0.0.1:8000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: csrftoken=nqGWlCEbwSjUwBeSQyfBNXUqxVGn18gQUz5954jE2XwjiHk3gEqNcZEApxWto8Qm Upgrade-Insecure-Requests: 1现再改一改代码,我们可以回复一些信息
import socket s = socket.socket() s.bind(('127.0.0.1', 8000)) s.listen(5) while True: conn, addr = s.accept() print(conn.recv(512).decode()) conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>Hello World</h1>') conn.close()然后如果我们在浏览器输入网址127.0.0.1:8000会显示
为了让我们的网站丰富起来我们可以设置各种路径
import socket s = socket.socket() s.bind(('127.0.0.1', 8000)) s.listen(5) def main(): # 假设我们在同一个文件夹里面有一个index.html content = open('index.html').read() return 'HTTP/1.1 200 OK\r\n\r\n'+content def another_page(): # 假设我们在同一个文件夹里面有一个page.html content = open('page.html').read() return 'HTTP/1.1 200 OK\r\n\r\n'+content while True: conn, addr = s.accept() req = conn.recv(512).decode() # 这是在分解请求,得出想要的信息 req = req.split('\r\n')[0] # 每一个换行都是'\r\n' print(req) req = req.split(' ')[1] print(req) ret = 0 if req = '/': ret = main() elif req = '/this': ret = another_page() conn.send(ret.encode()) conn.close()希望观众老爷们能看得懂,感谢,