一.Rest API簡介
REST即表述性狀態傳遞(RepreSentational State Transfer),是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。
表述性狀態轉移是一組構架約束條件和原則,滿足這些約束和原則的應用程序或設計就是RESTful,REST是設計風格而不是標准,它通常基於使用HTTP,URI,XML以及HTML這些現有的廣泛流行的協議和標准。
REST定義了一組體系構架原則,可以根據這些原則設計以系統資源為中心的Web服務,包括使用不同語言編寫的客戶端如何通過HTTP處理和傳輸資源狀態。
二.ryu中REST API簡介
ryu已經提供了一些RESTAPI的定義,在ryu/app目錄下可以找到如下相關的文件:
ofctl_rest.py rest_topology.py rest_firewall.py rest_qos.py rest_router.py
打開這些文件簡單瀏覽下可以發現他們分別提供了和OpenFlow協議,拓撲等相關的信息查詢和配置,查詢的結果以json格式返回給瀏覽器,而配置會調用相關模塊的相關函數,可以簡單的看下獲取SDN網絡中的交換機的代碼。獲取switches的指令為:http://ip:port/stats/switches,首先會解析出Http請求(GET),以及所需要的內容(switches),然后調用對應的函數(get_dpids)。在函數中,得到對應的內容,然后以json形式返回
path = '/stats' uri = path + '/switches' mapper.connect('stats', uri, controller=StatsController, action='get_dpids', conditions=dict(method=['GET'])) def get_dpids(self, req, **_kwargs): dps = list(self.dpset.dps.keys()) body = json.dumps(dps) return Response(content_type='application/json', body=body)
了解代碼是為了更好的用它,或者可以輕易的修改,得到自己想要的結果,淺嘗輒止,不宜重復造車
在使用對應的RESTAPI之前,需要用ryu-manager *.rest*..py加載對應的模塊
三. ryu常用的RESTAPI簡介
最常用RESTAPI是ofctl_rest.py提供的RESTAPI,它提供了與OpenFlow相關的接口,如查看交換機,最有用的應該是查看、添加、修改流表等。在oftcl_rest.py文件的前面注釋部分我們可以得到接口的使用方法,列舉如下:
# Retrieve the switch stats # # get the list of all switches # GET /stats/switches # # get the desc stats of the switch # GET /stats/desc/<dpid> # # get flows stats of the switch # GET /stats/flow/<dpid> # # get flows stats of the switch filtered by the fields # POST /stats/flow/<dpid> # # get aggregate flows stats of the switch # GET /stats/aggregateflow/<dpid> # # get aggregate flows stats of the switch filtered by the fields # POST /stats/aggregateflow/<dpid> # # get table stats of the switch # GET /stats/table/<dpid>
比如為了得到SDN網絡中的所有交換機,需要用GET /stats/switches,如果要用瀏覽器進行查看,使用http://ip:port/stats/switches發送GET請求
四. ryu中RESTAPI的三種使用方式
- 在瀏覽器中輸入類似http://ip:port/stats/switches命令來發送GET請求,獲取信息,ip為控制器的IP,ryu提供的port為8080
- 用curl(curl是利用URL語法在命令行方式下工作的開源文件傳輸工具)代替瀏覽器,在終端輸入curl http://ip:port/stats/switches來傳輸內容
- 利用chrome等瀏覽器提供的插件Postman,經過使用,非常推薦這種方法,原因如下:
- 提供了Pretty和Raw兩種結果展示方法,Raw和前面兩種方法的返回格式一樣,但是Pretty的格式的可視性和便讀性遠遠好於Raw
- 提供了JSON和XML兩種格式展示結果
- 下發流表同樣簡單,可視化比較好,只需要在body里面按照python字典的格式書寫流表,然后下發即可
- 可以顯示對請求的response,比如成功的話STATUS會顯示200 OK
流表的靈活性是SDN網絡的優勢之一,利用上述方法在查看流表,驗證網絡功能,開發APP具有非常重要的作用