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来说,这个例子有几点不足,但是作为简单的演示,
应该够了。
class Restful(BaseHTTPRequestHandler): #すべて残りの父类
def __init__(self,request, client_address, server):
BaseHTTPRequestHandler.__init__(self,request, client_address, server)
self. dp=なし
self.router=なし
defbasepath(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 doned(self):
self.dp=self.basepath()
self.router=self.getrestlet()
クラステスト(Restful): #测试1
def test(self): #这就是一资源
return "{"date":"2013-11-19"}"
def do_GET(self): #重写getメソッド给了通客户端请求的url找到应的资源
self.done()
self.router.keys() のキー:
tmp=self.dp+key
tmp の場合self.path:
self.send(self.router[key]()) #执行资源
defbasepath(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,"日":[23,21,3]}"
src3="{"vpc":5,"vrouter":3,"日":[13,2,23]}"
tlist=[src1,src2,src3]
cmpvpc=""vpc":"+vpc
cmpvr=""vrouter":"+vr
for k in tlist:
if cmp vpc in k および 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={}
パラメータのpの場合:
tmp=p.split('=')
pdict[tmp[0]]]=tmp[1]
self.router.keys() :
if k in key:
self.send(self.router[k](pdict['vpc'],pdict['vrouter'])) #执行资源
self に elif 'firewall'。 path:
self.send(self.router['/firewall']())
else:
self.send("{}")
defbasepath(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()
以外キーボード割り込み:
sys.exit(0)
上のプログラムを実行する場合、実行されるのはテスト 2 であり、このプログラムの後に実行されるのは 8084 です。
今回は浏览器地址栏输入http://127.0.0.1:8084/ins/json?vpc=1&vrouter=3は、実際に使用するクロム、インストール後の効果を次の図のように取得します。
ここでは単にパフォーマンスとして、プログラムが不足しています。
basepath() と getrestlet() は、実装されたソース エリア (つまり、上のテスト エリア) ではこれに対応せず、ルーターも機能しません。
これは別のクラスで行われており、異なる URI を介して実行できますが、2 つのテストはどちらも実行できます。また、Python のバンドルの BaseHTTPServer モジュールも使用されており、動作が不安定です。
ただし、操作手順は通常このようなもので、その後、一定の時間をかけて Python バージョンの安静な簡単フレームワークが記述されます。