簡介:
自從Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式后,REST就基本上迅速取代了復雜而笨重的SOAP,成為Web API的標准了。
如果一個URL返回的不是HTML,而是機器能直接解析的數據,這個URL就可以看成是一個Web API。
REST就是一種設計API的模式。最常用的數據格式是JSON。
比方說下載最流行的AI技術,百度這個流氓還是開放了API接口,供我們有限度的免費調用。
這個使用的就是API。
學習RESTful API,對我們以后使用別人開放的API又很大的好處
我們一起來看看RESTFul API有哪些特點:
- 基於“資源”,數據也好、服務也好,在RESTFul設計里一切都是資源。
- 無狀態。一次調用一般就會返回結果,不存在類似於“打開連接-訪問數據-關閉連接”這種依賴於上一次調用的情況。
- URL中通常不出現動詞,只有名詞
- URL語義清晰、明確
- 使用HTTP的GET、POST、DELETE、PUT來表示對於資源的增刪改查
-
使用JSON不使用XML
我舉個例子:
網站:/get_user?id=3
RESTFul: GET /user/3 (GET是HTTP類型)
作者:
鏈接:https://www.imooc.com/article/17650
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
一:使用RESTful API的好處
1.返回的不是HTML,而是機器能直接解析的數據
隨着ajax的流行,API返回數據,而不是HTML頁面,數據交互量減少,用戶體驗會好。
前后台分離,后台更多的進行數據處理,前台對數據進行渲染。
2.直接使用api可以進行CRUD,增刪改查
一個標准的API,會有4個接口,get,put,post,delete,對應你的請求類型。就是WEB獲取頁面,上傳表單,上傳文件…………
增刪改查,結構清晰
3.使用token令牌來進行用戶權限認證,比cookie更安全
雖然我還沒明白這是什么意思,但是cookie確實是我爬網站時使用最多的偽造渠道。
4.越來越多的開放平台,開始使用api接口
我們學習了如果構建API,那么也就熟悉了解了如何使用,對以后使用開放API,又很大的幫助。
也許某天,我們自己寫的程序,也會開放一些API接口給大家用,那也應該符合RESTful API標准。
二:快速入門
1.官網
其實這個不是官網,但是是中文文檔。
http://www.pythondoc.com/Flask-RESTful/quickstart.html
2.安裝
安裝 Flask 和 Flask-RESTful。
本人測試環境如下:
Flask==1.0.2
Flask-HTTPAuth==3.2.4
Flask-RESTful==0.3.6
requests==2.19.1
python 3.6.3
windows 10 x64
3.無腦測試
快速入門當中的代碼貌似和我現在的版本不太匹配了。
下面這個是我改好的。
from flask import Flask from flask_restful import Api,Resource app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True)
這個代碼跑起來看看訪問:http://127.0.0.1:5000,返回值是
{ "hello": "world" }
而且我們沒有注冊首頁路由,用了api.add_resource.。
返回的是一個JSON格式字符串。
三:用requests庫深入測試
1.get就是我們日常瀏覽器訪問的方式
沒錯,就是爬蟲用的requests庫。
from requests import get,put,post,delete #測試get t1=get('http://127.0.0.1:5000') print(t1) #返回碼 print(t1.text) #內容4
返回值:
<Response [200]> { "hello": "world" }
返回碼200,返回的text是json數據
2.put
from requests import get,put,post,delete #測試get t1=put('http://127.0.0.1:5000') print(t1) #返回碼 print(t1.text) #內容
返回值:
<Response [405]> { "message": "The method is not allowed for the requested URL." }
還沒寫這個方法
我們沒寫都會有正確的信息返回,還是用庫吧,比自己寫方便多了。
主要是更加標准化。
四:完整代碼
1.官方文檔的完整代碼示例
from flask import Flask from flask_restful import reqparse, abort, Api, Resource app = Flask(__name__) api = Api(app) TODOS = { 'todo1': {'task': 'build an API'}, 'todo2': {'task': '?????'}, 'todo3': {'task': 'profit!'}, } def abort_if_todo_doesnt_exist(todo_id): if todo_id not in TODOS: abort(404, message="Todo {} doesn't exist".format(todo_id)) parser = reqparse.RequestParser() parser.add_argument('task', type=str) # Todo # show a single todo item and lets you delete them class Todo(Resource): def get(self, todo_id): abort_if_todo_doesnt_exist(todo_id) return TODOS[todo_id] def delete(self, todo_id): abort_if_todo_doesnt_exist(todo_id) del TODOS[todo_id] return '', 204 def put(self, todo_id): args = parser.parse_args() task = {'task': args['task']} TODOS[todo_id] = task return task, 201 # TodoList # shows a list of all todos, and lets you POST to add new tasks class TodoList(Resource): def get(self): return TODOS def post(self): args = parser.parse_args() todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1 todo_id = 'todo%i' % todo_id TODOS[todo_id] = {'task': args['task']} return TODOS[todo_id], 201 ## ## Actually setup the Api resource routing here ## api.add_resource(TodoList, '/todos') api.add_resource(Todo, '/todos/<todo_id>') if __name__ == '__main__': app.run(debug=True)
2.深入測試
from requests import get,put,post,delete t1=get('http://127.0.0.1:5000/todos') #測試get 全部 print(t1) #返回碼 print(t1.text) #內容 t2=get('http://127.0.0.1:5000/todos/todo1') #測試獲取一條 print(t2) print(t2.text) t3=put('http://127.0.0.1:5000/todos/todo1',data={'task':'jack test'}) #測試修改一條,todo1 print(t3) print(t3.text) t4=get('http://127.0.0.1:5000/todos/todo1') #重新獲取todo1 print(t4) print(t4.text) t5=delete('http://127.0.0.1:5000/todos/todo1') #刪除一個 todo1 print(t5) print(t5.text) t6=get('http://127.0.0.1:5000/todos') #重新獲取全部 print(t6) print(t6.text) t7=post('http://127.0.0.1:5000/todos',data={'task':'new line'}) print(t7) print(t7.text) #測試創建一個 t8=get('http://127.0.0.1:5000/todos') print(t8) print(t8.text)
3.總結
測試代碼中使用了嵌套字典來進行測試,換成數據庫,應該會吧?
