利用Python 搭建HttpServer(二)

2018-05-18  本文已影响67人  YuWenHaiBo

接着上一篇文章,这里介绍 do_POST方法该怎么玩

 def do_POST(self):
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        post_data = self.rfile.read(content_length) # <--- Gets the data itself

        logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                str(self.path), str(self.headers), post_data.decode('utf-8'))

        self.do_HEAD()
        self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))

这里我们首先获取了content_length这个值,这个值干嘛的呢?我们得补充点http的知识了,当然懂得可以跳过我们post为啥要这个值
下面介绍下http工作原理,
首先你得知道tcp是什么,不知道的自己去补,一般来说,tcp连接建立好之后我们就可以互相发送消息了,http也是一样先建立一个tcp连接,然后发消息,不过它发消息是有格式的,一般是这样的

POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,... (CRLF)
...
HOST:127.0.0.1:8080 (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF)         //该CRLF表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234  //此行以下为提交的数据

我们发送post请求如下:http://127.0.0.1:8080/reg.jsp
这时候我们发过去的就是上面的内容,这里的Content-Length:22指的是user=jeffrey&pwd=1234 这个内容长度,为啥要用这个值呢?这是因为怕数据没有一次发过来,我们可以通过长度来知道继续接收。
就补充这么多,要解释的很多如果细说的话,比如(CRLF)这里指的是/r/n,为啥这个格式要换行,其实说来说去都是为了方便解析,就说这么多了,知道后我们继续讲do_POST,
post_data = self.rfile.read(content_length) ,这个是读取body体里面的内容就是user=jeffrey&pwd=1234 ,我们得知道他的长度所以前面我们获取了长度
self.do_HEAD(),这里do_HEAD名字可以乱取,你用do_response,也可以,主要就是设置

  def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

请求头的比如你用上面的返回的就是

HTTP/1.1 200 OK (CRLF)
Content-Type: text/htm (CRLF)
...
 (CRLF)
POST request for /

这里
self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
就是设置上面POST request for /
你换成self.wfile.write("123456789")

HTTP/1.1 200 OK (CRLF)
Content-Type: text/htm (CRLF)
...
 (CRLF)
123456789

这个就是对方收到的信息,这样你想给对面发什么就可以调用,self.wfile.write("") 给对面发送消息
do_GET我就简单提一点,GET和POST区别是他没有body体,他所有的都是在url中传入的比如
发送get请求
http://127.0.0.1:8080?user=jeffrey&pwd=1234
收到就是

 GET /?user=jeffrey&pwd=1234 HTTP/1.1..
Host: 127.0.0.1:8080..
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) 
...

我们要的值就在/?user=jeffrey&pwd=1234这里,GET没有请求体的,当然我们回复都是post回复的,我们把回复的内容放在body里面,至于有没有get回复,我看这个Python都是利用post回复的

上一篇下一篇

猜你喜欢

热点阅读