美文网首页
利用Python 搭建HttpServer(二)

利用Python 搭建HttpServer(二)

作者: YuWenHaiBo | 来源:发表于2018-05-18 10:55 被阅读67次

    接着上一篇文章,这里介绍 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回复的

    相关文章

      网友评论

          本文标题:利用Python 搭建HttpServer(二)

          本文链接:https://www.haomeiwen.com/subject/mpgwdftx.html