博主平时做移动app开发,与服务端交互时常需要单独看看请求结果,嫌打印Log烦,开网页low,于是有了个小工具。
界面用Tkinter做的,发请求用的urllib2,可动态添加参数,暂未处理request header,运行图:
源码:http://download.csdn.net/detail/ober2012/9450126 (python代码可能有点java风格,勿喷。。)
代码不长,都直接贴出来了:
(1)__init__.py 程序入口,主要是主界面布局逻辑和2个按钮响应函数
#coding=utf8
from UiItem import ParamItem, MethodCheckButton, HostBox
from Tkinter import *
from HttpPerformer import *
from urllib import quote
import thread
root = Tk()
root.geometry('600x400')
root.title("HttpTester")
paramItemList = [] #存储参数控件的列表,以便动态添加
methodBox = MethodCheckButton(root)
methodBox.grid(row = 0, column = 0)
deleteCount = IntVar() #记录已删除的个数,仅仅为了布局时grid()
deleteCount.set(0)
"""获取所有请求参数"""
def getAllParams():
dict = {}
for paramItem in paramItemList:
k = paramItem.getKey()
v = paramItem.getValue()
if len(k) > 0:
print k, v
dict.setdefault(str(k), v.encode("utf8"))
return dict
"""按钮相应函数 ,增加一个参数控件"""
def addParam():
currentParamCount = len(paramItemList)
newParamItem = ParamItem(root, paramItemList, deleteCount)
paramItemList.append(newParamItem)
newParamItem.grid(row = currentParamCount + 2 + deleteCount.get(), columnspan = 2)
btnAdd = Button(root, text = "Add Param", command = addParam)
btnAdd.grid(row = 0, column = 1)
hostBox = HostBox(root)
hostBox.grid(row = 1, columnspan = 2)
"""按钮相应函数,异步发起请求"""
def perform():
method = methodBox.getCurrentMethod()
host = hostBox.getHost()
url = hostBox.getUrl()
port = hostBox.getPort()
param = getAllParams()
headers = {}
if HttpPerformer.check(method, host, url, port, param, headers):
performer = HttpPerformer(method, host, url, port, param, headers)
#一个简单的异步处理, Tkinter 对异步支持不好,只能这样啦。
thread.start_new_thread(performer.connect, ())
#轮询请求结果
def pollFunc():
flag = performer.getFlag()
if flag == 0 or flag == 1:
root.after(1000, pollFunc)
elif flag == 2:
performer.showResult()
elif flag == -1:
performer.showResultFail()
root.after(1000, pollFunc)
btnPerform = Button(root, text = "Perform", command = perform, padx = 3)
btnPerform.grid(row = 0, column = 2)
root.mainloop()
(2)UiItem.py 包装了3个小控件,直接看图:
MethodCheckBox:
HostBox:
ParamItem:
'''
Created on 2016-2-17
@author: Administrator
'''
from Tkinter import Frame, Label, Entry, Button, Checkbutton, IntVar, StringVar
""" 输入参数的控件 """
class ParamItem(Frame):
def __init__(self, master, itemList, deleteCount):
Frame.__init__(self, master)
self.labelKey = Label(self, text = "Key:")
self.labelValue = Label(self, text = "Value:")
self.entryKey = Entry(self, width = 8)
self.entryValue = Entry(self, width = 20)
self.deleteCount = deleteCount
self.itemList = itemList
self.btnDelete = Button(self, text = "delete", \
command = self.__internalDelete, padx = 5)
self.__boxComponents()
def __boxComponents(self):
self.labelKey.grid(row = 0, column = 0)
self.entryKey.grid(row = 0, column = 1)
self.labelValue.grid(row = 0, column = 2)
self.entryValue.grid(row = 0, column = 3)
self.btnDelete.grid(row = 0, column = 4)
def __internalDelete(self):
self.deleteCount.set(self.deleteCount.get() + 1)
self.itemList.remove(self)
self.destroy()
def getKey(self):
return self.entryKey.get()
def getValue(self):
return self.entryValue.get()
"""选择Get Post的控件"""
class MethodCheckButton(Frame):
def __init__(self, master):
Frame.__init__(self, master, width = 15)
self.initComplete = False
self.getVar = IntVar()
self.postVar = IntVar()
self.getCheckButton = Checkbutton(self, \
text = "GET", width = 6, variable = self.getVar, \
command = self.__singleSelectCommandGet, onvalue = 1, offvalue = 0)
self.postCheckButton = Checkbutton(self, \
text = "POST", width = 6, variable = self.postVar, \
command = self.__singleSelectCommandPost, onvalue = 1, offvalue = 0)
self.label = Label(self, text = "Use Method:", padx = 3)
self.__boxComponents()
self.initComplete = True
def __boxComponents(self):
self.label.grid(row = 0, column = 0)
self.getCheckButton.grid(row = 0, column = 1)
self.postCheckButton.grid(row = 0, column = 2)
def __singleSelectCommandGet(self):
if self.initComplete == False:
return
self.postCheckButton.deselect()
def __singleSelectCommandPost(self):
if self.initComplete == False:
return
self.getCheckButton.deselect()
def getCurrentMethod(self):
if self.getVar.get() == 1:
return "get"
if self.postVar.get() == 1:
return "post"
return None
"""输入host url port 的控件"""
class HostBox(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.labelHost = Label(self, text = "Host: http://")
self.entryHost = Entry(self, width = 20)
self.labelUrl = Label(self, text = "Url:")
self.entryUrl = Entry(self, width = 20)
self.labelPort = Label(self, text = "Port:")
self.port = StringVar()
self.port.set("80")
self.entryPort = Entry(self, width = 8, textvariable = self.port)
self.__boxComponents()
def __boxComponents(self):
self.labelHost.grid(row = 0, column = 0)
self.entryHost.grid(row = 0, column = 1)
self.labelUrl.grid(row = 1, column = 0)
self.entryUrl.grid(row = 1, column = 1)
self.labelPort.grid(row = 0, column = 2)
self.entryPort.grid(row = 0, column = 3)
def getHost(self):
return self.entryHost.get()
def getPort(self):
return self.port.get()
def getUrl(self):
return self.entryUrl.get()
(3)HttpPerformer.py 发送Http请求的类,并显示结果
'''
Created on 2016-2-17
@author: Administrator
'''
from Tkinter import *
import httplib
import urllib
import urllib2
from urllib2 import URLError
class HttpPerformer:
"""发起请求之前,简单检查参数"""
@staticmethod
def check(method, host, url, port, param, header):
if method == None:
msg = "method is Null !"
elif len(host) < 3:
msg = "invalid host"
elif not port.isdigit():
msg = "invalid port"
else:
return True
root = Tk()
Message(root, text = msg).pack()
root.mainloop()
return False
def __init__(self, method, host, url, port, param, header = {}):
self.method = method
self.host = host
self.url = url
self.port = port
self.param = param
self.header = header
self.flag = 0
return
"""显示错误提示"""
def showResultFail(self):
e = self.e
msg = ""
try:
msg = msg + str(e.code) + "\n"
except Exception, e:
print(e)
try:
msg = msg + str(e.reason) + "\n"
except Exception, e:
print(e)
if msg == "":
msg = "url open error"
root = Tk()
root.title("Failed")
textShow = Text(root)
textShow.insert(INSERT, msg)
textShow.pack()
self.flag = 0
root.mainloop()
"""显示成功提示"""
def showResult(self):
data = self.data
msg = str(data)
root = Tk()
root.title("Result")
textShow = Text(root)
textShow.insert(INSERT, msg)
textShow.pack()
self.flag = 0
root.mainloop()
"""发起请求, 并维护flag的值"""
def connect(self):
if self.flag == 1:
print "is connecting! return!"
return
self.flag = 1
paramEncoded = None
resp = None
data = ""
if not self.param == None:
if len(self.param) > 0:
paramEncoded = urllib.urlencode(self.param)
try:
requestUrl = "http://" + self.host + ":" + str(self.port)
if len(self.url) > 0:
requestUrl += self.url
##doGet
if self.method == "get":
if not paramEncoded == None:
requestUrl = requestUrl + "?" + paramEncoded
req = urllib2.Request(url=requestUrl, headers=self.header)
resp = urllib2.urlopen(req)
data = resp.read()
self.data = data
##doPost
else:
req = None
if not paramEncoded == None:
req = urllib2.Request(url=requestUrl, data=paramEncoded, headers=self.header)
else:
req = urllib2.Request(url=requestUrl, headers=self.header)
resp = urllib2.urlopen(req)
data = resp.read()
self.data = data
except URLError, e:
print e
self.flag = -1
self.e = e
return
print "success"
self.flag = 2
""" flag : 0:prepare 1:connecting 2:success -1:failed"""
def getFlag(self):
return self.flag
ps:初用python,希望大神指点