服务器代码
#!/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;对象
答案 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.