- GET :請求從服務器獲取特定資源。舉個例子:
GET /classs
(獲取所有班級) - POST :在服務器上創建一個新的資源。舉個例子:
POST /classs
(創建班級) - PUT :更新服務器上的資源(客戶端提供更新后的整個資源)。舉個例子:
PUT /classs/12
(更新編號為 12 的班級) - DELETE :從服務器刪除特定的資源。舉個例子:
DELETE /classs/12
(刪除編號為 12 的班級) - PATCH :更新服務器上的資源(客戶端提供更改的屬性,可以看做作是部分更新),使用的比較少,這里就不舉例子了
講restful的:https://mp.weixin.qq.com/s/10oSdNPwBDi_yXExt0uDMg
版本:https://developer.github.com/v3/, 有的將版本放在head里
參數規范:下划線命名
url規范:url中不能有動詞,只能有名詞,且是名詞復數
對於參數特別多的,路由可以寫成:[Route(“api/orders/{address}/{month}”)],
如:https://example.com/api/orders/beijing/6?order_amount_greater=500&sort=order_amount_desc
返回格式:json 或 xml
==================
https://www.cnblogs.com/sss4/p/8097653.html
https://www.cnblogs.com/Sunzz/category/1474541.html
https://www.cnblogs.com/kaituorensheng/p/4645080.html
https://www.cnblogs.com/pyspark/p/8677750.html
restful api 最佳實踐 http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
=====================
RESTful API就是基於HTTP協議對互聯網的內容定義的方式提出的一套互聯網應用的架構體系,其中信息以JSON的形式進行存儲,對對象的資源、操作、狀態
進行定義,RESTful是一種設計模式規范的指南,不是強制性的要求,所以要靠開發者自己遵守
URL基本要求
1.協議:HTTP或HTTPS
2.域名和地址一般格式:http://<域名>/api/<version>
3.域名和地址之后接資源名字統一用復數
DELETE www.baidu.com/api/v1/articles?author=1&category=2 # 標准的restful api 示例 # 動詞 DELETE,表示要進行的操作是刪除,即狀態轉移 # 賓語 articles,表示文章這種資源URI,推薦用復數,即表現層 # 定語 author=1&category=2,表示具體是什么資源 # 版本 api/v1,這個能夠幫助我們更好的進行版本的升級,同時不影響原有的請求
restful api的特點:
無狀態 請求URL = 動作(GET/POST/PUT/DELETE)+ 資源 響應使用精確的狀態碼和JSON格式數據
寫RESTful API步驟
1.想清楚我們的應用里可以抽象出什么樣的資源,和他們的層次結構
2.想清楚對對象的基本操作:GET,POST,PUT,DELETE的含義是什么
3.組織接口代碼。Spring如何去定義這些路由(URL):URL->Java類方法
4.開始實現
作者:迷路的丸子
鏈接: https://www.jianshu.com/p/846bb2c9098e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
======================
RESTful API返回的不是HTML,而是機器能直接解析的數據
隨着ajax的流行,API返回數據,而不是HTML頁面,數據交互量減少,用戶體驗會好。
前后台分離,后台更多的進行數據處理,前台對數據進行渲染。
如果在普通的網站中,這個插件就顯得有些雞肋了,因為在普通的網頁開發中,是需要去渲染HTML代碼的,而Flask-Restful在每個請求中都是返回json格式的數據。
@app.route('/post/<path:path>')
# 接收URL鏈接類型參數 app=Flask(__name__) @app.route('/<path:url>/') #設置url傳參數:http://127.0.0.1:5000/http://www.baiu.com/ def first_flask(url): #視圖必須有對應接收參數 print(url) return 'Hello World' #response if __name__ == '__main__': app.run() 接收URL鏈接類型參數
注意如果要給視圖函數加裝飾器增加新功能,一點要加在路由裝飾器下面
設置cookie和響應頭
response = make_response(render_template('index.html')) response是flask.wrappers.Response類型 response.delete_cookie('key') response.set_cookie('key', 'value') response.headers['X-Something'] = 'A value' return respons
Flask使用的是Jinja2模板,所以其語法和Django無差別(Django的模板語言參考Jinja2)
1.@app.before_first_request :請求第1次到來執行1次,之后都不執行;
2.@app.before_request:請求到達視圖之前執行;(改函數不能有返回值,否則直接在當前返回)
3.@app.after_request:請求 經過視圖之后執行;(最下面的先執行)
request.method: 獲取請求方法 request.json request.json.get("json_key"):獲取json數據 **較常用 request.argsget('name') :獲取get請求參數 request.form.get('name') :獲取POST請求參數 request.form.getlist('name_list'):獲取POST請求參數列表(多個) request.values.get('age') :獲取GET和POST請求攜帶的所有參數(GET/POST通用) request.cookies.get('name'):獲取cookies信息 request.headers.get('Host'):獲取請求頭相關信息 request.path:獲取用戶訪問的url地址,例如(/,/login/,/ index/); request.full_path:獲取用戶訪問的完整url地址+參數 例如(/login/?age=18) request.script_root: 抱歉,暫未理解其含義; request.url:獲取訪問url地址,例如http://127.0.0.1:5000/?age=18; request.base_url:獲取訪問url地址,例如 http://127.0.0.1:5000/; request.url_root request.host_url request.host:獲取主機地址 request.files:獲取用戶上傳的文件
# 獲取一個參數的一個值 http://127.0.0.1:5000/request?username=abcd username = request.args.get("username") # print(username) """打印效果: abcd """ # 獲取一個參數的多個值 # http://127.0.0.1:5000/request?username=xiaoming&love=吹牛&love=睡覺 love = request.args.getlist("love") # print(love) """打印效果: ['吹牛', '睡覺']""" # 把傳遞過來的數據抓換成原生的字典 data = request.args.to_dict() # print(data) """打印效果:{'username': 'xiaoming', 'love': '吹牛'} """
在 Flask 中可以直接使用 jsonify 生成一個 JSON 的響應 from flask import Flask, request, jsonify @app.route("/") def index(): # 也可以響應json格式代碼 data = [ {"id":1,"username":"liulaoshi","age":18}, {"id":2,"username":"liulaoshi","age":17}, {"id":3,"username":"liulaoshi","age":16}, {"id":4,"username":"liulaoshi","age":15}, ] return jsonify(data)
Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
如訪問luffy.com時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,無法訪問到luffy.com寫的Cookie信息
瀏覽器的同源策略針對cookie也有限制作用.
當瀏覽器請求某網站時,會將本網站下所有Cookie信息提交給服務器,所以在request中可以讀取Cookie信息
注意: Session依賴於Cookie,而且flask中使用session,需要配置SECRET_KEY選項,否則報錯. 設置session from flask import session @app.route('/set_session') def set_session(): session['username'] = 'xiaoming' return 'ok!' 獲取session @app.route('/get_session') def get_session(): return session.get('username')
before_first_request 在處理第一個請求前執行 before_request 在每次請求前執行 如果在某修飾的函數中返回了一個響應,視圖函數將不再被調用.一般可以用來判斷權限,或者轉換路由參數或者預處理客戶端的請求的數據 after_request 如果沒有拋出錯誤,在每次請求后執行.一般可以用於記錄會員/管理員的操作歷史,瀏覽歷史,清理收尾的工作 接受一個參數:視圖函數作出的響應 在此函數中可以對響應值在返回之前做最后一步修改處理 需要將參數中的響應在此參數中進行返回 teardown_request: 在每次請求后執行 接受一個參數:錯誤信息,如果有相關錯誤拋出 需要設置flask的配置DEBUG=False,teardown_request才會接受到異常對象。
捕獲指定異常類型 @app.errorhandler(ZeroDivisionError) def zero_division_error(e): return '除數不能為0'
application 指的就是當你調用app = Flask(__name__)創建的這個對象app;
request 指的是每次http請求發生時,WSGI server(比如gunicorn)調用Flask.__call__()之后,在Flask對象內部創建的Request對象;
請求上下文對象有:request、session
應用上下文對象有:current_app,g
注意:不同的請求,會有不同的全局變量
- 請求上下文:保存了客戶端和服務器交互的數據
- 應用上下文:flask 應用程序運行過程中,保存的一些配置信息,比如程序名、數據庫連接、應用信息等
通常的做法就是把token值放在header里面。