python模塊restful使用方法實例
RESTful架構,目前是比較流行的一種互聯(lián)網軟件架構。REST,即Representational State Transfer的縮寫。
說白點就是網站即軟件,再白點就是一個服務軟件支持http的四種方法:
GET用來獲取資源,POST用來新建資源、更新資源,PUT用來更新資源,DELETE用來刪除資源。
并對外提供一個或多個URI,每個URI對應一個資源;客戶端通過URI配合上面的方法就可以和服務
段的軟件交互??蛻舳酥饕菫g覽器,使用restful框架的軟件對http的支持也為了web應用帶來方便。
REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。他的貢獻很多,
可以了解一下。本人工作的方向是SDN,也算是比較潮的東東,其中floodlight就用到了restful框架。
開發(fā)者為軟件開發(fā)出一些功能,并提供URI api,用戶就可以利用瀏覽器、curl等工具通過提供的URI
從軟件中獲得想要的信息或者設置軟件的功能。
對于發(fā)開者來說,就是提供URI和URI對應的資源,并將他們對應上,類似dicts={'/path?':resource}。
比如重寫http GET方法:首先獲得客戶端請求的url,解析url然后判斷其對應的URI,由于URI與應一個資源,
那么url就可以訪問這個資源了。具體實現(xiàn)上資源也就是方法或者一個類,要看具體實現(xiàn)了。
下面來個很簡單的例子,因為對于真正功能強大的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]()) #執(zhí)行資源
def basepath(self): #這個簡單的說就是和下面函數(shù)中的路徑配合,即/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復雜些,因為參數(shù)的值需要從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('&') #解析獲得屬性信息,傳遞給資源函數(shù)
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'])) #執(zhí)行資源
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,運行后此程序監(jiān)聽8084。
此時在瀏覽器地址欄輸入http://127.0.0.1:8084/ins/json?vpc=1&vrouter=3
得到如下圖,本人使用的chrome,安裝插件后的效果。
這里僅僅作為演示,程序有有許多不足。對于好的框架,注冊資源不應該和資源在同一個類中,
basepath()與getrestlet()不應該在實現(xiàn)的資源類里(也就是上面的測試里),也使router沒起作用。
應該在另一個類里注冊,這樣可以通過不同的URI,兩個測試都應該能夠運行;還有就是使用的python自帶的BaseHTTPServer模塊,并不適合做restful。
但是工作過程大體就是這樣,后續(xù)有時間會寫個python版的restful簡易框架。
- Python利用Django如何寫restful api接口詳解
- 在Python的框架中為MySQL實現(xiàn)restful接口的教程
- Python restful框架接口開發(fā)實現(xiàn)
- Python實現(xiàn)Restful API的例子
- Python中Flask-RESTful編寫API接口(小白入門)
- 使用Python & Flask 實現(xiàn)RESTful Web API的實例
- Python進行Restful?API開發(fā)實例詳解
- python用post訪問restful服務接口的方法
- python Flask實現(xiàn)restful api service
- 探索?Python?Restful?接口測試的奧秘
相關文章
分享一下Python 開發(fā)者節(jié)省時間的10個方法
在這篇文章,我想強調一些 Python 可以節(jié)約時間并最大限度地提高生產力的方面。在做準備時,我咨詢了幾個 Pythonists,他們最節(jié)省時間的技巧是什么?答案在這里2015-10-10Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例
這篇文章主要為大家介紹了Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10基于Python對數(shù)據(jù)shape的常見操作詳解
今天小編就為大家分享一篇基于Python對數(shù)據(jù)shape的常見操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12