python之簡析restful

     RESTful架構,目前是比較流行的一種互聯網軟件架構。REST,即Representational State Transfer的縮寫。html

說白點就是網站即軟件,再白點就是一個服務軟件支持http的四種方法:python

     GET用來獲取資源,POST用來新建資源、更新資源,PUT用來更新資源,DELETE用來刪除資源。web

     並對外提供一個或多個URI,每一個URI對應一個資源;客戶端經過URI配合上面的方法就能夠和服務chrome

段的軟件交互。客戶端主要是瀏覽器,使用restful框架的軟件對http的支持也爲了web應用帶來方便。json

     REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。他的貢獻不少,api

能夠了解一下。本人工做的方向是SDN,也算是比較潮的東東,其中floodlight就用到了restful框架。瀏覽器

開發者爲軟件開發出一些功能,並提供URI api,用戶就能夠利用瀏覽器、curl等工具經過提供的URIrestful

從軟件中得到想要的信息或者設置軟件的功能。架構

     對於發開者來講,就是提供URI和URI對應的資源,並將他們對應上,相似dicts={'/path?':resource}。框架

好比重寫http GET方法:首先得到客戶端請求的url,解析url而後判斷其對應的URI,因爲URI與應一個資源,

那麼url就能夠訪問這個資源了。具體實現上資源也就是方法或者一個類,要看具體實現了。

     下面來個很簡單的例子,由於對於真正功能強大的restful來講,這個例子有幾點不足,可是做爲簡單的演示,

應該夠了。

  

 1 #-*-coding:UTF-8-*-
 2 import socket,sys,urllib
 3 from BaseHTTPServer import *
 4 
 5 class Restful(BaseHTTPRequestHandler):  #全部rest的父類
 6     def __init__(self,request, client_address, server):
 7         BaseHTTPRequestHandler.__init__(self,request, client_address, server)
 8         self.dp=None
 9         self.router=None
10         
11     def basepath(self):
12         pass
13     def getresetlet(self):
14         pass
15     def send(self,src):
16         self.send_response(200)
17         self.send_header("Content-type", "text/html")
18         self.end_headers()
19         self.wfile.write(src)
20         self.wfile.close()
21     def done(self):
22         self.dp=self.basepath()
23         self.router=self.getrestlet()
24 class Test(Restful):            #測試1
25     def test(self):  #這就是一個資源
26         return "{\"date\":\"2013-11-19\"}"
27     def do_GET(self):  #重寫get方法給了經過客戶端請求的url找到對應的資源
28         self.done()
29         for key in self.router.keys():
30             tmp=self.dp+key
31             if tmp in self.path:
32                   self.send(self.router[key]()) #執行資源
33     def basepath(self): #這個簡單的說就是和下面函數中的路徑配合,即/wm/time
34         return "/wm"
35     def getrestlet(self):  #這兒就是URI與資源對應,這裏只有test資源,能夠註冊多個
36         rr={}
37         rr['/time']=self.test 
38           return rr
39 class testjson(Restful):      #測試2
40     def testjson(self,vpc,vr):  #這裏比測試1複雜些,由於參數的值須要從url中得到
41         src1="{\"vpc\":1,\"vrouter\":3,\"day\":[1,2,3]}"
42         src2="{\"vpc\":1,\"vrouter\":4,\"day\":[23,21,3]}"
43         src3="{\"vpc\":5,\"vrouter\":3,\"day\":[13,2,23]}"
44         tlist=[src1,src2,src3]
45         cmpvpc="\"vpc\":"+vpc
46         cmpvr="\"vrouter\":"+vr
47         for k in tlist:
48             if cmpvpc in k and cmpvr in k:
49                 return k
50     def firewall(self):
51         return "{\"filter\":[\"baid.com/\",\"c.cn/\"],\"acl\":{\"accept\":123,\"reject\":321}}"
52     def do_GET(self):  #重寫GET,解析url,這裏的self.path相似:/ins/json?vpc=1&vrouter=3
53         self.done()
54         print self.path
55         if 'vpc' in self.path and 'vrouter' in self.path:
56             query=None
57             if '?' in self.path:
58                 query =    urllib.splitquery(self.path)
59             key=query[0]+'?'
60             param=query[1].split('&') #解析得到屬性信息,傳遞給資源函數
61             pdict={}
62             for p in param:
63                 tmp=p.split('=')
64                 pdict[tmp[0]]=tmp[1]  
65             for k in self.router.keys():
66                 if k in key:
67                     self.send(self.router[k](pdict['vpc'],pdict['vrouter'])) #執行資源
68         elif 'firewall' in self.path:
69             self.send(self.router['/firewall']())
70         else:
71             self.send("{}")
72     def basepath(self):
73         return "/ins"
74     def getrestlet(self):
75         rr={}
76         rr['/json?']=self.testjson #註冊資源
77         rr['/firewall']=self.firewall
78         return rr
79         
80             
81 try:
82     server=HTTPServer(('',8084),testjson) #測試2
83     server.serve_forever()
84 except KeyboardInterrupt:
85     sys.exit(0)

 

      若是運行上面的程序,運行的是測試2,運行後此程序監聽8084。

此時在瀏覽器地址欄輸入http://127.0.0.1:8084/ins/json?vpc=1&vrouter=3

獲得以下圖,本人使用的chrome,安裝插件後的效果。

        

輸入:http://127.0.0.1:8084/ins/firewall

      

      這裏僅僅做爲演示,程序有有許多不足。對於好的框架,註冊資源不該該和資源在同一個類中,

basepath()與getrestlet()不該該在實現的資源類裏(也就是上面的測試裏),也使router沒起做用。

應該在另外一個類裏註冊,這樣能夠經過不一樣的URI,兩個測試都應該可以運行還有就是使用的python

自帶的BaseHTTPServer模塊,並不適合作restful。

     可是工做過程大致就是這樣,後續有時間會寫個python版的restful簡易框架。

相關文章
相關標籤/搜索