自從Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式後,REST就基本上迅速取代了複雜而笨重的SOAP,成爲Web API的標準了。html
若是一個URL返回的不是HTML,而是機器能直接解析的數據,這個URL就能夠當作是一個Web API。python
REST就是一種設計API的模式。最經常使用的數據格式是JSON。ajax
比方說下載最流行的AI技術,百度這個流氓仍是開放了API接口,供咱們有限度的免費調用。數據庫
這個使用的就是API。json
學習RESTful API,對咱們之後使用別人開放的API又很大的好處flask
咱們一塊兒來看看RESTFul API有哪些特色:windows
使用JSON不使用XMLapi
我舉個例子:
網站:/get_user?id=3
RESTFul: GET /user/3 (GET是HTTP類型)瀏覽器
隨着ajax的流行,API返回數據,而不是HTML頁面,數據交互量減小,用戶體驗會好。安全
先後臺分離,後臺更多的進行數據處理,前臺對數據進行渲染。
一個標準的API,會有4個接口,get,put,post,delete,對應你的請求類型。就是WEB獲取頁面,上傳表單,上傳文件…………
增刪改查,結構清晰
雖然我還沒明白這是什麼意思,可是cookie確實是我爬網站時使用最多的僞造渠道。
咱們學習了若是構建API,那麼也就熟悉瞭解瞭如何使用,對之後使用開放API,又很大的幫助。
也許某天,咱們本身寫的程序,也會開放一些API接口給你們用,那也應該符合RESTful API標準。
其實這個不是官網,可是是中文文檔。
http://www.pythondoc.com/Flask-RESTful/quickstart.html
安裝 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
快速入門當中的代碼貌似和我如今的版本不太匹配了。
下面這個是我改好的。
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庫。
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數據
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." }
還沒寫這個方法
咱們沒寫都會有正確的信息返回,仍是用庫吧,比本身寫方便多了。
主要是更加標準化。
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)
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)
測試代碼中使用了嵌套字典來進行測試,換成數據庫,應該會吧?