restful API規(guī)范
- url鏈接纹安,不能有動詞煤篙,只能有名詞慢味,出現(xiàn)復(fù)數(shù)亦镶,就加s
常用狀態(tài)碼
- 200 服務(wù)器成功響應(yīng)客戶端的請求
- 201 創(chuàng)建新資源成功
- 204 資源被刪除成功(可以不真的重數(shù)據(jù)庫刪除,可以增加一個狀態(tài)status=207等來表示屬于刪除的資源)
- 400 bad request
- 401用戶沒權(quán)限
- 403 因?yàn)槟承┰蚪乖L問這個請求
- 404 用戶發(fā)送的url不存在
- 406 用戶請求不被服務(wù)器接收灼狰,(比如服務(wù)器期望客戶端發(fā)送某個字段宛瞄,但是沒有發(fā)送)
- 500 服務(wù)器內(nèi)部錯誤,
使用 Python 和 Flask 實(shí)現(xiàn) RESTful services(一)
from flask import Flask, jsonify, abort, make_response, request, redirect, url_for
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
tasks = [{
'id': 1,
'title': "python書籍",
'content': "我是python入門書籍交胚,了解一下"
},
{
'id': 2,
'title': "Java書籍",
'content': "我是java入門書籍份汗,了解一下"
}
]
#查詢所有tasks
@app.route("/todo/api/v1.0/tasks", methods=["GET"])
def get_tasks():
return jsonify(tasks)
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'not found'}),404
if __name__ == '__main__':
app.run()
效果圖:
#根據(jù)id查詢 ,python3中蝴簇,filter是一個可遍歷的對象杯活,用list直接轉(zhuǎn)成列表
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
else:
data = task[0]
if data:
print(data)
return jsonify(data)
增加一個task,201表示創(chuàng)建新資源成功
#添加一個tasks
@app.route('/todo/api/v1.0/tasks/add', methods=['POST'])
def create_taask():
if not request.form or not 'title' in request.form:
abort(404)
task = {"id": request.form['id'], 'title': request.form['title']
, 'content': request.form.get('content', "")}
tasks.append(task)
return jsonify(tasks), 201
@app.route("/todo/api/v1.0/tasks/del", methods=["POST"])
def del_task():
if not request.form or not "id" in request.form:
abort(404)
else:
id = request.form.get("id")
print(type(id))
# 注意獲取的是str類型
task = list(filter(lambda t: t['id'] == int(id), tasks))
if len(task) == 0:
abort(404)
else:
data = task[0]
if data:
tasks.remove(data)
return jsonify(tasks)
以上代碼就使用flask提供的jsonify實(shí)現(xiàn)一個查看列表,查看某一條信息熬词,增加某一條旁钧,刪除某一條的基本接口使用,注意到?jīng)]得
互拾,增加的id=a歪今,沒有做驗(yàn)證,id重復(fù)也沒有驗(yàn)證颜矿。平常寄猩,最好是結(jié)合數(shù)據(jù)庫來操作。更多使用flask-restful插件
加強(qiáng) RESTful web service 的安全性
不加以驗(yàn)證骑疆,如果一個陌生人弄清我們的 API 是如何工作的田篇,他或她可以編寫一個客戶端訪問我們的 web service 并且毀壞我們的數(shù)據(jù)。
注意
:確保我們的 web service 安全服務(wù)的最簡單的方法是要求客戶端提供一個用戶名和密碼封断。在常規(guī)的 web 應(yīng)用程序會提供一個登錄的表單用來認(rèn)證斯辰,并且服務(wù)器會創(chuàng)建一個會話為登錄的用戶以后的操作使用,會話的 id 以 cookie 形式存儲在客戶端瀏覽器中坡疼。然而 REST 的規(guī)則之一就是 “無狀態(tài)”彬呻, 因此我們必須要求客戶端在每一次請求中提供認(rèn)證的信息。
既然我們需要實(shí)現(xiàn)認(rèn)證我們需要在 HTTP 上下文中去完成,HTTP 協(xié)議提供了兩種認(rèn)證機(jī)制: Basic 和 Digest闸氮。
flask-httpauth插件
from flask_httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
"""@auth.get_password
def get_password(username):
if username == 'admin':
return '123456'
return None"""
"""@auth.verify_password
def verify_password(email,password):
pass
if user.verify_password(password):
return True"""
@auth.error_handler
def unauthorized():
return make_response(jsonify({'error': 'Unauthorized access'}), 401)
...
@app.route("/todo/api/v1.0/tasks", methods=["GET"])
@auth.login_required
def get_tasks():
return jsonify(tasks)
復(fù)制地址到瀏覽器剪况,會彈出輸入框,為了不要輸入框可改成error_handler中可改成403
注意蒲跨,驗(yàn)證的話译断,我們可以用get_password,來驗(yàn)證user叫admin,密碼是123456的用戶,或者驗(yàn)證用戶中有沒得叫某某名字的或悲,只要唯一孙咪,我們就可以用來驗(yàn)證,或者使用verfy_password來參考資料
參考資料2
最后感謝文章作者:傳送門