API是應用程式介面,可以理解為與不同軟體系統通訊的通道。它本質上是一個預先定義的函數。
API有多種形式,最受歡迎的一種是使用HTTP協定提供服務(如:RESTful),只要符合規定就可以正常使用。現在很多企業都使用第三方提供的API,也提供第三方API,所以API的設計也需要謹慎。
闡明功能
在設計之初,你需要依照商業功能點或模組來組織API的功能,明確你的API需要提供的
清晰的程式碼邏輯
保持程式碼整潔並添加必要的註釋以確保介面具有單一功能。如果接口需要複雜的業務邏輯,建議將其拆分為多個接口,或者將功能獨立封裝成公共方法,避免接口中代碼過多,不利於維護和後期迭代。
必要的安全校驗和
常見的解決方案是使用數位簽章。為每個HTTP請求新增簽名,伺服器端驗證簽名的有效性,確保請求的真實性。
記錄
日誌記錄對於及時定位問題至關重要。
最小化耦合
一個好的 API 應該盡量簡單。如果API之間的業務耦合度太高,很容易導致某段程式碼出現異常,導致相關API無法使用。所以還是盡量避免API之間關係的複雜性吧。
傳回有意義的狀態碼
API回傳資料中應攜帶狀態碼資料。例如,200表示請求正常,500表示伺服器出現內部錯誤。傳回通用的狀態碼有利於問題定位。
開發文件
由於API是提供給第三方或內部使用的,所以開發文件是必不可少的,否則別人不知道如何使用。
一個好的API開發文件應該包含以下元素:
如果對開發環境滿意,大概不到10分鐘,就可以完成一個簡單API介面的開發(只是一個demo)。
開發前需要安裝JDK、Maven和IDE。
建立一個基於Spring Boot的新專案。為了快速完成,我選擇使用(start.spring.io)來產生我的專案。透過【搜尋要新增的依賴項】可以選擇套件。我只導入了Spring MVC,如果需要透過Mybatis存取資料庫,也可以選擇這裡,然後點擊生成項目。
解壓縮下載的專案並將其引入到您的IDE中,然後建立一個新類別:com.wukong.apidemo.controller.ApiController。
在這個類別中加入一個方法,主要使用@RestController、@RequestMapping、@ResponseBody標籤。
最簡單的API介面已經完成。我們可以啟動項目,存取對應的介面位址,並取得介面返回資訊。
我們可以使用swagger來幫助我們產生介面文檔,並最佳化API介面。
Python Flask 和 Java Spring Boot 都可以用來有效率地建立 API 介面。
Spring Boot 將開發過程簡化為簡單。對於python,我推薦一個用於開發API介面的第三方包:fastapi。
這是一個快速且有效率的工具,具有以下功能:
建立 RESTful API 似乎是開發人員的工作,事實上,有許多場景需要測試開發人員建立 RESTful API。
有些測試人員會建立RESTful API,將伺服器端網域名稱劫持到自己的API上,故意傳回各種異常,以查看客戶端的穩定性。
REST: REpresentational State Transfer GET - /api/Category - Retrieve all categories POST - /api/Category - Add a new category PUT - /api/Category - Update a category DELETE - /api/Category - Delete a category GET - /api/Comment - Retrieve all the stored comments POST - /api/Comment - Add new comment
要求:python3.*,PostgreSQL.
REST: REpresentational State Transfer GET - /api/Category - Retrieve all categories POST - /api/Category - Add a new category PUT - /api/Category - Update a category DELETE - /api/Category - Delete a category GET - /api/Comment - Retrieve all the stored comments POST - /api/Comment - Add new comment
Requirements.txt如下:
Flask - python 微框架
Flask_restful - Flask 的擴展,用於快速建立 REST API。
Flask_script - 提供在 Flask 中編寫外部腳本的支援。
Flask_migrate - 使用 Alembic 的 Flask 應用程式進行 SQLAlchemy 資料庫遷移。
Marshmallow - 用於複雜資料類型和 python 資料類型轉換。
Flask_sqlalchemy - 新增了對 SQLAlchemy 的支援的 Flask 擴充。
Flask_marshmallow - 燒瓶與棉花糖之間的中間層。
Marshmallow-sqlalchemy - sqlalchemy 與 marshmallow 之間的中間層。
psycopg - 用於 python 的 PostgreSQL API。
安裝依賴項
project/ ├── app.py ├── config.py ├── migrate.py ├── Model.py ├── requirements.txt ├── resources │ └── Hello.py │ └── Comment.py │ └── Category.py └── run.py
安裝並設定PostgreSQL(以Ubuntu 16.04為例)
# pip3 install -r requirements.txt
配置
# sudo apt-get update && sudo apt-get upgrade # apt-get install postgresql postgresql-contrib # su - postgres $ createdb api $ createuser andrew --pwprompt #Create User $ psql -d api -c "ALTER USER andrew WITH PASSWORD 'api';"
快速入門
app.py
from flask import Blueprint from flask_restful import Api from resources.Hello import Hello from resources.Category import CategoryResource from resources.Comment import CommentResource api_bp = Blueprint('api', __name__) api = Api(api_bp) # Routes api.add_resource(Hello, '/Hello') api.add_resource(CategoryResource, '/Category') api.add_resource(CommentResource, '/Comment')
資源/Hello.py
from flask import Blueprint from flask_restful import Api from resources.Hello import Hello api_bp = Blueprint('api', __name__) api = Api(api_bp) # Route api.add_resource(Hello, '/Hello')
run.py
#!/usr/bin/python # -*- coding: utf-8 -*- # Author: xurongzhong#126.com wechat:pythontesting qq:37391319 # CreateDate: 2018-1-10 from flask_restful import Resource class Hello(Resource): def get(self): return {"message": "Hello, World!"} def post(self): return {"message": "Hello, World!"}
開始服務
from flask import Flask def create_app(config_filename): app = Flask(__name__) app.config.from_object(config_filename) from app import api_bp app.register_blueprint(api_bp, url_prefix='/api') return app if __name__ == "__main__": app = create_app("config") app.run(debug=True)
使用瀏覽器:http://127.0.0.1:5000/api/Hello
$ python3 run.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 136-695-873
存取資料庫
{ "hello": "world" }
遷移.py
from flask import Flask from marshmallow import Schema, fields, pre_load, validate from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy ma = Marshmallow() db = SQLAlchemy() class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) comment = db.Column(db.String(250), nullable=False) creation_date = db.Column(db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False) category_id = db.Column(db.Integer, db.ForeignKey('categories.id', ondelete='CASCADE'), nullable=False) category = db.relationship('Category', backref=db.backref('comments', lazy='dynamic' )) def __init__(self, comment, category_id): self.comment = comment self.category_id = category_id class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(150), unique=True, nullable=False) def __init__(self, name): self.name = name class CategorySchema(ma.Schema): id = fields.Integer() name = fields.String(required=True) class CommentSchema(ma.Schema): id = fields.Integer(dump_only=True) category_id = fields.Integer(required=True) comment = fields.String(required=True, validate=validate.Length(1)) creation_date = fields.DateTime()
資料遷移
from flask_script import Manager from flask_migrate import Migrate, MigrateCommand from Model import db from run import create_app app = create_app('config') migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()
測試
您可以使用curl,例如:
$ python3 migrate.py db init $ python3 migrate.py db migrate $ python migrate.py db upgrade
以上是如何製作API介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!