如何阅读,处理变量POST,Python HTTP Server

时间:2017-02-18 16:37:39

标签: python http post server

服务器代码

#!/usr/bin/env python
import BaseHTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler
import SocketServer
import urlparse
import cgitb
import cgi
from cgi import parse_header, parse_multipart


class S(BaseHTTPRequestHandler):
 def _set_headers(self):
  self.send_response(200)
  self.send_header('Content-type', 'text/html')
  self.end_headers()

 def do_GET(self):
   self._set_headers()
   self.wfile.write("<html><body><h1>hi!</h1></body></html>")

 def do_HEAD(self):
   self._set_headers()

 def do_POST(self):
  ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
  if ctype == 'multipart/form-data':
   postvars = cgi.parse_multipart(self.rfile, pdict)
  elif ctype == 'application/x-www-form-urlencoded':
   length = int(self.headers.getheader('content-length'))
   postvars = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
  else:
   postvars = {}

def run(server_class=BaseHTTPServer.HTTPServer, handler_class=S, port=80):
 server_address = ('', port)
 httpd = server_class(server_address, handler_class)
 print 'Starting httpd...'
 httpd.serve_forever()

if __name__ == "__main__":

        run()

客户为例

客户端通过程序Postman发送POST请求。

GET有效。

发布不起作用。发送请求时,这是服务器上的错误

http://192.168.2.108?var1=value

服务器上的错误

  

在处理来自(&#39; 192.168.2.107&#39;的请求期间发生异常,   49629)回溯(最近一次调用最后一次):文件   &#34; /usr/lib/python2.7/SocketServer.py" ;,第295行,在   _handle_request_noblock       self.process_request(request,client_address)文件&#34; /usr/lib/python2.7/SocketServer.py",第321行,在process_request中       self.finish_request(request,client_address)file&#34; /usr/lib/python2.7/SocketServer.py" ;,第334行,在finish_request中       self.RequestHandlerClass(request,client_address,self)File&#34; /usr/lib/python2.7/SocketServer.py" ;,第655行,在 init 中       self.handle()File&#34; /usr/lib/python2.7/BaseHTTPServer.py" ;,第340行,句柄       self.handle_one_request()File&#34; /usr/lib/python2.7/BaseHTTPServer.py" ;,第328行,in   handle_one_request       方法()文件&#34; server.py&#34;,第37行,在do_POST中       ctype,pdict = cgi.parse_header(self.headers.getheader(&#39; content-type&#39;))文件   &#34; /usr/lib/python2.7/cgi.py",第309行,在parse_header中       parts = _parseparam(&#39 ;;&#39; + line)TypeError:无法连接&#39; str&#39;和&#39; NoneType&#39;对象

1 个答案:

答案 0 :(得分:0)

可能是因为您的客户端发送的请求不包含内容类型标头。

您没有说明如何连接服务器。

curl -X POST http://localhost:8880/?var1=value

如上所示将失败。虽然:

 curl -X POST http://localhost:8880/?var1=value -H 'Content-type: application/x-www-form-urlencoded'

也会失败,但还有一点:你还需要一个内容长度标题。你需要的是检查类方法返回给你的值,而不是相信一切都会按照你希望的那样发生:

def do_POST(self):
    content_type = self.headers.getheader('content-type')
    if content_type is None:
        raise ... # 400 Invalid Request

    # otherwise go on.