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,urllib
from 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 rr
class 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
这里仅仅作为演示,程序有有许多不足。对于好的框架,注册资源不应该和资源在同一个类中,
basepath()与getrestlet()不应该在实现的资源类里(也就是上面的测试里),也使router没起作用。
应该在另一个类里注册,这样可以通过不同的URI,两个测试都应该能够运行;还有就是使用的python自带的BaseHTTPServer模块,并不适合做restful。
但是工作过程大体就是这样,后续有时间会写个python版的restful简易框架。
python模块,restful
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。