python服务器端收发请求的实现代码
最近学习了python的一些服务器端编程,记录在此。
发送get/post请求
#coding:utf-8
importhttplib,urllib#加载模块
#urllib可以打开网站去拿
#res=urllib.urlopen('http://baidu.com');
#printres.headers
#定义需要进行发送的数据
params=urllib.urlencode({'param':'6'});
#定义一些文件头
headers={"Content-Type":"application/x-www-form-urlencoded",
"Connection":"Keep-Alive",'Content-length':'200'};
#与网站构建一个连接
conn=httplib.HTTPConnection("localhost:8765");
#开始进行数据提交同时也可以使用get进行
conn.request(method="POST",url="/",body=params,headers=headers);
#返回处理后的数据
response=conn.getresponse();
printresponse.read()
#判断是否提交成功
ifresponse.status==200:
print"发布成功!^_^!";
else:
print"发布失败\^0^/";
#关闭连接
conn.close();
利用urllib模块可以方便的实现发送http请求.urllib的参考手册
http://docs.python.org/2/library/urllib.html
建立http服务器,处理get,post请求
#coding:utf-8
fromBaseHTTPServerimportHTTPServer,BaseHTTPRequestHandler
classRequestHandler(BaseHTTPRequestHandler):
def_writeheaders(self):
printself.path
printself.headers
self.send_response(200);
self.send_header('Content-type','text/html');
self.end_headers()
defdo_Head(self):
self._writeheaders()
defdo_GET(self):
self._writeheaders()
self.wfile.write("""<!DOCTYPEHTML>
<htmllang="en-US">
<head>
<metacharset="UTF-8">
<title></title>
</head>
<body>
<p>thisisget!</p>
</body>
</html>"""+str(self.headers))
defdo_POST(self):
self._writeheaders()
length=self.headers.getheader('content-length');
nbytes=int(length)
data=self.rfile.read(nbytes)
self.wfile.write("""<!DOCTYPEHTML>
<htmllang="en-US">
<head>
<metacharset="UTF-8">
<title></title>
</head>
<body>
<p>thisisput!</p>
</body>
</html>"""+str(self.headers)+str(self.command)+str(self.headers.dict)+data)
addr=('',8765)
server=HTTPServer(addr,RequestHandler)
server.serve_forever()
注意这里,python把response的消息体记录在了rfile中。BaseHpptServer没有实现do_POST方法,需要自己重写。之后我们新建类RequestHandler,继承自baseHTTPServer重写do_POST方法,读出rfile的内容即可。
但是要注意,发送端必须指定content-length.若不指定,程序就会卡在rfile.read()上,不知道读取多少。
参考手册http://docs.python.org/2/library/basehttpserver.html