首頁 > web前端 > js教程 > 如何製作API介面?

如何製作API介面?

Linda Hamilton
發布: 2024-12-09 12:28:15
原創
374 人瀏覽過

How to make an API interface?

API是應用程式介面,可以理解為與不同軟體系統通訊的通道。它本質上是一個預先定義的函數。

API有多種形式,最受歡迎的一種是使用HTTP協定提供服務(如:RESTful),只要符合規定就可以正常使用。現在很多企業都使用第三方提供的API,也提供第三方API,所以API的設計也需要謹慎。

如何設計一個好的API介面?

  1. 闡明功能
    在設計之初,你需要依照商業功能點或模組來組織API的功能,明確你的API需要提供的

  2. 清晰的程式碼邏輯
    保持程式碼整潔並添加必要的註釋以確保介面具有單一功能。如果接口需要複雜的業務邏輯,建議將其拆分為多個接口,或者將功能獨立封裝成公共方法,避免接口中代碼過多,不利於維護和後期迭代。

  3. 必要的安全校驗和
    常見的解決方案是使用數位簽章。為每個HTTP請求新增簽名,伺服器端驗證簽名的有效性,確保請求的真實性。

  4. 記錄
    日誌記錄對於及時定位問題至關重要。

  5. 最小化耦合
    一個好的 API 應該盡量簡單。如果API之間的業務耦合度太高,很容易導致某段程式碼出現異常,導致相關API無法使用。所以還是盡量避免API之間關係的複雜性吧。

  6. 傳回有意義的狀態碼
    API回傳資料中應攜帶狀態碼資料。例如,200表示請求正常,500表示伺服器出現內部錯誤。傳回通用的狀態碼有利於問題定位。

  7. 開發文件
    由於API是提供給第三方或內部使用的,所以開發文件是必不可少的,否則別人不知道如何使用。

一個好的API開發文件應該包含以下元素:

  1. API架構模型描述、開發工具及版本、系統相依等環境資訊。
  2. API提供的功能。
  3. API 模組相依性。
  4. 呼叫規則、註解。
  5. 部署說明等

如何開發API介面?

如果對開發環境滿意,大概不到10分鐘,就可以完成一個簡單API介面的開發(只是一個demo)。

開發前需要安裝JDK、Maven和IDE。

  1. 建立一個基於Spring Boot的新專案。為了快速完成,我選擇使用(start.spring.io)來產生我的專案。透過【搜尋要新增的依賴項】可以選擇套件。我只導入了Spring MVC,如果需要透過Mybatis存取資料庫,也可以選擇這裡,然後點擊生成項目。

  2. 解壓縮下載的專案並將其引入到您的IDE中,然後建立一個新類別:com.wukong.apidemo.controller.ApiController。

  3. 在這個類別中加入一個方法,主要使用@RestController、@RequestMapping、@ResponseBody標籤。

  4. 最簡單的API介面已經完成。我們可以啟動項目,存取對應的介面位址,並取得介面返回資訊。

  5. 我們可以使用swagger來幫助我們產生介面文檔,並最佳化API介面。

更有效率的API介面製作方法?

Python Flask 和 Java Spring Boot 都可以用來有效率地建立 API 介面。

Spring Boot 將開發過程簡化為簡單。對於python,我推薦一個用於開發API介面的第三方包:fastapi。

這是一個快速且有效率的工具,具有以下功能:

  1. 快速:與 NodeJS 和 Go 相當。最快的 Python 框架之一。
  2. 快速編碼:將開發速度提高約 200% 至 300%。
  3. 更少的錯誤:減少開發人員造成的約 40% 的錯誤。
  4. 簡單:易於使用和學習。花在閱讀文件上的時間更少。
  5. 基於標準:基於且完全相容API的開放標準。

使用Python3和Flask製作RESTful API(介面測試服務和Mockserver工具)

建立 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板