restful架构,目前是比较流行的一种互联网软件架构。rest,即representational state transfer的缩写。
说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法:
get用来获取资源,post用来新建资源、更新资源,put用来更新资源,delete用来删除资源。
并对外提供一个或多个uri,每个uri对应一个资源;客户端通过uri配合上面的方法就可以和服务
段的软件交互。客户端主要是浏览器,使用restful框架的软件对http的支持也为了web应用带来方便。
rest这个词,是roy thomas fielding在他2000年的博士论文中提出的。他的贡献很多,
可以了解一下。本人工作的方向是sdn,也算是比较潮的东东,其中floodlight就用到了restful框架。
开发者为软件开发出一些功能,并提供uri api,用户就可以利用浏览器、curl等工具通过提供的uri
从软件中获得想要的信息或者设置软件的功能。
对于发开者来说,就是提供uri和uri对应的资源,并将他们对应上,类似dicts={‘/path?’:resource}。
比如重写http get方法:首先获得客户端请求的url,解析url然后判断其对应的uri,由于uri与应一个资源,
那么url就可以访问这个资源了。具体实现上资源也就是方法或者一个类,要看具体实现了。
下面来个很简单的例子,因为对于真正功能强大的restful来说,这个例子有几点不足,但是作为简单的演示,
应该够了。
代码如下:
#-*-coding:utf-8-*-import socket,sys,urllibfrom basehttpserver import *
class restful(basehttprequesthandler): #所有rest的父类 def __init__(self,request, client_address, server): basehttprequesthandler.__init__(self,request, client_address, server) self.dp=none self.router=none def basepath(self): pass def getresetlet(self): pass def send(self,src): self.send_response(200) self.send_header(“content-type”, “text/html”) self.end_headers() self.wfile.write(src) self.wfile.close() def done(self): self.dp=self.basepath() self.router=self.getrestlet()class test(restful): #测试1 def test(self): #这就是一个资源 return “{\”date\”:\”2013-11-19\”}” def do_get(self): #重写get方法给了通过客户端请求的url找到对应的资源 self.done() for key in self.router.keys(): tmp=self.dp+key if tmp in self.path: self.send(self.router[key]()) #执行资源 def basepath(self): #这个简单的说就是和下面函数中的路径配合,即/wm/time return “/wm” def getrestlet(self): #这儿就是uri与资源对应,这里只有test资源,可以注册多个 rr={} rr[‘/time’]=self.test return rrclass testjson(restful): #测试2 def testjson(self,vpc,vr): #这里比测试1复杂些,因为参数的值需要从url中获得 src1=”{\”vpc\”:1,\”vrouter\”:3,\”day\”:[1,2,3]}” src2=”{\”vpc\”:1,\”vrouter\”:4,\”day\”:[23,21,3]}” src3=”{\”vpc\”:5,\”vrouter\”:3,\”day\”:[13,2,23]}” tlist=[src1,src2,src3] cmpvpc=”\”vpc\”:”+vpc cmpvr=”\”vrouter\”:”+vr for k in tlist: if cmpvpc in k and cmpvr in k: return k def firewall(self): return “{\”filter\”:[\”baid.com/\”,\”c.cn/\”],\”acl\”:{\”accept\”:123,\”reject\”:321}}” def do_get(self): #重写get,解析url,这里的self.path类似:/ins/json?vpc=1&vrouter=3 self.done() print self.path if ‘vpc’ in self.path and ‘vrouter’ in self.path: query=none if ‘?’ in self.path: query = urllib.splitquery(self.path) key=query[0]+’?’ param=query[1].split(‘&’) #解析获得属性信息,传递给资源函数 pdict={} for p in param: tmp=p.split(‘=’) pdict[tmp[0]]=tmp[1] for k in self.router.keys(): if k in key: self.send(self.router[k](pdict[‘vpc’],pdict[‘vrouter’])) #执行资源 elif ‘firewall’ in self.path: self.send(self.router[‘/firewall’]()) else: self.send(“{}”) def basepath(self): return “/ins” def getrestlet(self): rr={} rr[‘/json?’]=self.testjson #注册资源 rr[‘/firewall’]=self.firewall return rr try: server=httpserver((”,8084),testjson) #测试2 server.serve_forever()except keyboardinterrupt: sys.exit(0)
如果运行上面的程序,运行的是测试2,运行后此程序监听8084。
此时在浏览器地址栏输入http://127.0.0.1:8084/ins/json?vpc=1&vrouter=3
得到如下图,本人使用的chrome,安装插件后的效果。