首页 >web前端 >js教程 >如何制作API接口?

如何制作API接口?

Linda Hamilton
Linda Hamilton原创
2024-12-09 12:28:15380浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn