帶有 Python REST Web 服務示例的 REST API 快速入門指南
REST 代表具象狀態轉移。
它是一種架構風格,一組用于標準化 Web 的規則,以保持全球 Web 應用程序的一致性。它旨在增強 Web 應用程序的可維護性、可擴展性、可靠性和可移植性。
REST 背后的主要思想是資源。您想要在 Web 應用程序中訪問的所有內容都是一種資源,無論是您想要下載、更新、刪除的媒體還是文檔。REST 定義了一種訪問、傳輸和修改這些資源的方法。
本篇涵蓋以下三個高級概念:
REST 基本概念——本節解釋了 6 個關鍵的 REST 架構約束
RESTful 實現的關鍵元素 – 本節介紹 RESTful 實現的 6 個不同元素
創建 Python REST Web 服務 – 本節提供有關在 Python 中創建基本 REST Web 服務的分步說明
REST 基本概念
正如 REST 的發明者 Roy Fielding 在他的研究論文中所討論的,以下是一些架構約束,這些約束將使任何 Web 服務成為 RESTful?。
1. 客戶端服務器
這個約束規定客戶端和服務器的實現應該是獨立的,兩者都應該能夠相互獨立地擴展和發展。客戶端應該只知道服務器上資源的 URI,別無其他。服務器應根據收到的客戶端請求返回適當的響應。
2. 無國籍
客戶端-服務器交互本質上應該是無狀態的。服務器不應存儲狀態數據,響應應完全取決于客戶端請求中存在的信息。然而,客戶端可以存儲保持會話狀態數據。這增強了交互的可擴展性和可靠性。
3.緩存
緩存的出現是為了解決 REST 的無狀態性問題。這個緩存是在客戶端實現的,并且緩存了可緩存的響應。如果將來客戶端請求一些它已經發送請求的數據,而不是再次向服務器發送請求,緩存可以重用緩存的響應。
4. 統一接口
這表明組件之間需要統一接口,服務器中的每個資源都應該只有一個邏輯 URI,并且應該公開訪問該資源的方法,并且應該遵循標準的命名約定。應使用通用方法訪問所有資源。這增強了 Web 界面的可見性。
5. 分層系統
分層系統方法指出Web 服務應該遵循分層方法,即我們應該將我們的Web 服務劃分到不同的層中,這些層不能超越它們的直接層,例如身份驗證層、數據訪問層、消息處理器層。這降低了系統復雜性并提高了可擴展性。
6. 按需編碼
這表明有時客戶端可以下載可執行代碼而不是靜態數據,即 JSON/XML。它增加了系統的可擴展性。
RESTFul 實現的關鍵要素
1.資源
REST 背后的基本思想是資源,存儲在 REST Web 服務數據存儲中的所有內容都是資源。在當前上下文中,存儲在 TGS 數據存儲中的文章是一種資源。
2.請求動詞
這些定義了訪問資源的方式,客戶端想要用它們做什么是用請求動詞指定的,這些是基本方法
GET:這將用于從 TGS Web 應用程序的數據存儲中獲取文章。
POST:這將用于在 TGS Web 應用程序中創建新文章。
PUT:如果 TGS 數據存儲中不存在,這將用于更新任何現有文章或創建新文章。
DELETE:這將用于從 TGS 數據存儲中刪除文章。
3. 請求頭
發送到服務器的額外請求以指定響應類型、編碼、內容類型和自定義參數。等等。
4. 請求體
嘗試創建資源時,資源數據在放置請求的正文中發送。
5. 響應體
Web 服務器在響應正文中返回數據。假設客戶端發送 GET 來查詢 python 類別的數據,Web 服務器將在響應正文中返回數據。
6 響應代碼
這些編碼與響應一起返回,并表示發送到服務器的請求的狀態。這些類似于 HTTP 響應代碼。例如,200 OK 表示請求成功,404 NOT FOUND 表示在服務器上找不到資源。
創建 Python REST Web 服務
讓我們使用 python 中的燒瓶創建一個簡單的 REST Web 服務,我們可以使用 Postman 工具或 Curl 命令行實用程序來使用這個 Web 服務。
我們在此服務中的資源將是文章,它將存儲在 TGS 上發布的所有文章,格式如下
類別
觀看次數
標題
我們將公開 REST 端點以添加、修改、刪除和更新文章。基于 REST 的 CRUD 功能。
讓我們一步一步開始:
1. 導入 Flask 模塊
首先,在代碼中導入flask 模塊并將我們的Web 服務命名為如下所示。
from flask import Flask from flask_restful import Resource, reqparse , api TGS = Flask(__name__) api = Api(TGS)
2. 創建資源文章
接下來,創建資源文章,這將是一個簡單的文章列表,我們也可以使用數據庫來存儲資源。
articles = [ { "category": "python", "views": 100, "title": "Dictionary" }, { "category": "java", "views": 200, "title": "java10" }, { "category": "elastic", "views": 300, "title": "elasticsearch" } ]
3. 創建 API 端點和 REST 方法
接下來,我們需要創建 api 端點和所需的 REST 方法,如下所示。
GET 方法將在文章列表中搜索請求的類別,如果找到則返回數據以及響應代碼 200 OK。否則 404 未找到
class Article(Resource): def get(self, category):
POST 方法將在文章列表中插入新的文章數據,并返回插入的數據并創建響應代碼 201。如果記錄已存在,則返回錯誤代碼 400 錯誤請求。
def post(self,category):
PUT 方法將覆蓋記錄并返回數據以及響應代碼 200 OK。如果記錄不存在,它會創建數據并返回它并創建響應代碼 201。
def put(self,category):
DELETE 方法刪除記錄(如果存在)并返回響應代碼為 200 OK 的數據。否則 404 未找到。
def delete(self,category):
4.注冊資源并分配URI
我們的最后一步是將我們的資源注冊到 REST API 并為其分配一個 URI。
api.add_resource(Article, "/category/
完整的 REST 示例程序
創建rest.py文件:
vi rest.py
將以下內容復制/粘貼到 rest.py 文件中:
from flask import Flask from flask_restful import Resource, reqparse ,Api TGS = Flask(__name__) api = Api(TGS) articles = [ { "category": "python", "views": 100, "title": "Dictionary" }, { "category": "java", "views": 200, "title": "java10" }, { "category": "elastic", "views": 300, "title": "elasticsearch" } ] class Article(Resource): def get(self, category): for article in articles: if(category == article["category"]): return article, 200 return "category not found", 404 def post(self, category): parser = reqparse.RequestParser() parser.add_argument("views") parser.add_argument("title") args = parser.parse_args() for article in articles: if(category == article["category"]): return "category {} already exists".format(category), 400 article = { "category": category, "views": args["views"], "title": args["title"] } articles.append(article) return article, 201 def put(self, category): parser = reqparse.RequestParser() parser.add_argument("views") parser.add_argument("title") args = parser.parse_args() for article in articles: if(category == article["category"]): article["views"] = args["views"] article["title"] = args["title"] return article, 200 article = { "category": category, "views": args["views"], "title": args["title"] } articles.append(article) return article, 201 def delete(self, category): global articles articles = [article for article in articles if article["category"] != category] return "{} is deleted.".format(category), 200 api.add_resource(Article, "/category/
測試 REST 程序
讓我們使用 Curl 實用程序對此進行測試,我們可以使用 postman 實用程序,它也是一個很棒的工具。
啟動 python glass REST 服務器
$ python rest.py * Serving Flask app "rest" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Restarting with stat * Debugger is active! * Debugger PIN: 145-292-899 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
1.從TGS的python類中獲取文章
$ curl -XGET http://127.0.0.1:8080/category/python % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 74 100 74 0 0 74000 0 --:--:-- --:--:-- --:--:-- 74000{ "category": "python", "views": 100, "title": "Dictionary" }
2. 向TGS發布新分類文章
$ curl -XPOST http://127.0.0.1:8080/category/c++ -H "Content-Type: application/json" --data '{ "category": "c++", "views": "199", "title": "tuples" }' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 125 100 69 100 56 1468 1191 --:--:-- --:--:-- --:--:-- 2659{ "category": "c++", "views": "199", "title": "tuples"
3. PUT一篇,修改C++類文章
$ curl -XPUT http://127.0.0.1:8080/category/c++ -H "Content-Type: application/json" --data '{ "category": "c++", "views": "201", "title": "tuples" }' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 125 100 69 100 56 69000 56000 --:--:-- --:--:-- --:--:-- 122k{ "category": "c++", "views": "201", "title": "tuples" }
$ curl -XGET http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 69 100 69 0 0 4312 0 --:--:-- --:--:-- --:--:-- 4312{ "category": "c++", "views": "201", "title": "tuples" }
如您所見,C++ 類別記錄已更新。
4. 從 C++ 類別中刪除一篇文章
$ curl -XDELETE http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 18 100 18 0 0 18000 0 --:--:-- --:--:-- --:--:-- 18000"c++ is deleted." $ curl -XGET http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 21 100 21 0 0 21000 0 --:--:-- --:--:-- --:--:-- 21000"category not found"
API Python web前端
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。