Berbagi teknologi

Apispec, perpustakaan Python untuk menghasilkan spesifikasi OpenAPI (Swagger).

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Daftar isi

01Apa itu spesifikasi API?

Mengapa memilih Apispec?

Instalasi dan konfigurasi

02Penggunaan dasar Apispec

Hasilkan dokumentasi API sederhana

1. Buat instans Apispec

2. Tentukan rute dan tampilan API

3. Tambahkan jalur ke Apispec

Integrasikan Flask dan APIspec

1. Instal Flask dan Flask-Apispec

2. Buat aplikasi Flask

Integrasikan Django dan APIspec

1. Instal Django dan Django-Rest-Framework

2. Membuat proyek dan aplikasi Django

3. Konfigurasikan proyek Django

4. Definisikan pandangan Django

5. Konfigurasikan URL

6. Hasilkan spesifikasi OpenAPI

03Fitur lanjutan Apispec

1. Generator khusus

2. Mendukung berbagai kerangka kerja

3. Secara otomatis menghasilkan dokumen antarmuka

4. Integrasikan dengan alat pihak ketiga

04Kasus praktis

1. Pengenalan Proyek

2. Struktur proyek

3. Instal dependensi

4. Tentukan modelnya

5. Tentukan tampilan dan serialisasi

6. Tentukan aplikasi utama

7. Jalankan aplikasi dan lihat dokumentasinya

Kunjungi http://localhost:5000/swagger/ untuk melihat dokumentasi API yang dihasilkan.

05Praktik Terbaik

06 Ringkasan



01Apa itu spesifikasi API?

Pengenalan spesifikasi API

Apispec adalah pustaka Python untuk menghasilkan spesifikasi OpenAPI (Swagger). Ini dapat membantu pengembang secara otomatis menghasilkan dan memelihara dokumen API dan memberikan deskripsi antarmuka yang intuitif dan terperinci. Melalui Apispec, kita dapat dengan mudah mengubah string dokumentasi fungsi atau kelas Python menjadi dokumen yang sesuai dengan spesifikasi OpenAPI, sehingga mengurangi kesulitan menulis dokumentasi secara manual.

Mengapa memilih Apispec?

  • Sederhana dan mudah digunakan: Apispec menyediakan API yang sederhana dan mudah digunakan sehingga Anda dapat memulai dengan cepat.

  • Fleksibel dan kuat: Mendukung banyak kerangka kerja (seperti Flask, Django) dan ekstensi, memungkinkan Anda menyesuaikan pembuatan dokumen sesuai kebutuhan.

  • otomatisasi: Mengurangi biaya pengoperasian dan pemeliharaan manual dengan membuat dan memperbarui dokumen secara otomatis.

Instalasi dan konfigurasi

Sebelum kita mulai menggunakan Apispec, kita perlu menginstalnya terlebih dahulu. Anda dapat menginstalnya menggunakan pip:

pip install apispec

Alamat proyek Github:

https://github.com/marshmallow-code/apispec

02Penggunaan dasar APIspec

Mari kita lihat penggunaan dasar Apispec melalui beberapa contoh sederhana.

Hasilkan dokumentasi API sederhana

1. Buat instans Apispec

  1. from apispec import APISpec
  2. spec = APISpec(
  3.     title="My API",
  4.     version="1.0.0",
  5.     openapi_version="3.0.0",
  6.     info=dict(description="This is a sample API"),
  7. )

2. Tentukan rute dan tampilan API

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

3. Tambahkan jalur ke Apispec

  1. spec.path(
  2.     path="/users/{user_id}",
  3.     operations=dict(
  4.         get=dict(
  5.             description="Get a user by ID",
  6.             parameters=[
  7.                 {
  8.                     "name""user_id",
  9.                     "in""path",
  10.                     "required"True,
  11.                     "schema": {"type""integer"},
  12.                 }
  13.             ],
  14.             responses={
  15.                 "200": {
  16.                     "description""A user object",
  17.                     "content": {
  18.                         "application/json": {
  19.                             "schema": {
  20.                                 "type""object",
  21.                                 "properties": {
  22.                                     "id": {"type""integer"},
  23.                                     "name": {"type""string"},
  24.                                 },
  25.                             }
  26.                         }
  27.                     },
  28.                 }
  29.             },
  30.         )
  31.     ),
  32. )

Integrasikan Flask dan APIspec

1. Instal Flask dan Flask-Apispec

pip install Flask Flask-Apispec

2. Buat aplikasi Flask

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec, doc, marshal_with
  3. from flask_apispec.views import MethodResource
  4. from marshmallow import Schema, fields
  5. app = Flask(__name__)
  6. class UserSchema(Schema):
  7.     id = fields.Int()
  8.     name = fields.Str()
  9. class UserResource(MethodResource):
  10.     @doc(description='Get a user by ID', tags=['User'])
  11.     @marshal_with(UserSchema)
  12.     def get(self, user_id):
  13.         return {"id": user_id, "name""John Doe"}
  14. app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
  15. docs = FlaskApiSpec(app)
  16. docs.register(UserResource)
  17. @app.route('/swagger/')
  18. def swagger_ui():
  19.     return jsonify(docs.spec.to_dict())
  20. if __name__ == '__main__':
  21.     app.run()

Integrasikan Django dan APIspec

1. Instal Django dan Django-Rest-Framework

pip install django djangorestframework

2. Membuat proyek dan aplikasi Django

  1. django-admin startproject myproject
  2. cd myproject
  3. django-admin startapp myapp

3. Konfigurasikan proyek Django

Tambahkan rest_framework dan apispec di settings.py:

  1. INSTALLED_APPS = [
  2.     ...
  3.     'rest_framework',
  4.     'myapp',
  5.     'apispec',
  6. ]

4. Definisikan pandangan Django

Di myapp/views.py:

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.schemas import AutoSchema
  4. class UserView(APIView):
  5.     schema = AutoSchema(
  6.         manual_fields=[
  7.             coreapi.Field('user_id', required=True, location='path', schema={'type''integer'})
  8.         ]
  9.     )
  10.     def get(self, request, user_id):
  11.         """
  12.         Get a user by ID.
  13.         ---
  14.         responses:
  15.           200:
  16.             description: A user object
  17.             content:
  18.               application/json:
  19.                 schema:
  20.                   type: object
  21.                   properties:
  22.                     id:
  23.                       type: integer
  24.                     name:
  25.                       type: string
  26.         """
  27.         return Response({"id": user_id, "name""John Doe"})

5. Konfigurasikan URL

Di myapp/urls.py:

  1. from django.urls import path
  2. from .views import UserView
  3. urlpatterns = [
  4.     path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
  5. ]

6. Hasilkan spesifikasi OpenAPI

Di kelola.py:

  1. from apispec import APISpec
  2. from rest_framework.schemas import get_schema_view
  3. spec = APISpec(
  4.     title="My API",
  5.     version="1.0.0",
  6.     openapi_version="3.0.0",
  7. )
  8. schema_view = get_schema_view(title="My API")
  9. schema = schema_view.get_schema(request=None, public=True)
  10. spec.components.schema('User', schema)
  11. spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
  12. print(spec.to_yaml())

03Fitur lanjutan dari APIspec

1. Generator khusus

APIspec menyediakan mekanisme ekstensi fleksibel yang memungkinkan Anda menyesuaikan generator. Anda dapat mengimplementasikan logika generasi Anda sendiri dengan mewarisi dan memperluas kelas dasar yang disediakan oleh Apispec.

  1. from apispec import BasePlugin
  2. class MyPlugin(BasePlugin):
  3.     def path_helper(self, operations, *, resource, **kwargs):
  4.         operations.update({
  5.             'get': {
  6.                 'description''Get a user by ID',
  7.                 'parameters': [
  8.                     {'name''user_id''in''path''required'True'schema': {'type''integer'}}
  9.                 ],
  10.                 'responses': {
  11.                     '200': {
  12.                         'description''A user object',
  13.                         'content': {
  14.                             'application/json': {
  15.                                 'schema': {
  16.                                     'type''object',
  17.                                     'properties': {
  18.                                         'id': {'type''integer'},
  19.                                         'name': {'type''string'}
  20.                                     }
  21.                                 }
  22.                             }
  23.                         }
  24.                     }
  25.                 }
  26.             }
  27.         })
  28. spec = APISpec(
  29.     title="My API",
  30.     version="1.0.0",
  31.     openapi_version="3.0.0",
  32.     plugins=[MyPlugin()],
  33. )

2. Mendukung berbagai kerangka kerja

Apispec mendukung berbagai framework Python populer, seperti Flask, Django, Falcon, dll. Anda dapat memilih kerangka kerja dan plug-in yang sesuai dengan kebutuhan Anda dan dengan cepat menghasilkan dokumen API.

3. Secara otomatis menghasilkan dokumen antarmuka

Apispec dapat secara otomatis menghasilkan dokumen antarmuka berdasarkan string dokumentasi suatu fungsi atau kelas, sehingga mengurangi beban kerja penulisan dokumen secara manual.

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

4. Integrasikan dengan alat pihak ketiga

Apispec dapat diintegrasikan dengan banyak alat pihak ketiga, seperti Swagger UI, ReDoc, dll., untuk menyediakan tampilan dokumen antarmuka yang intuitif dan fungsi pengujian.

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec
  3. app = Flask(__name__)
  4. @app.route('/users/<int:user_id>', methods=['GET'])
  5. def get_user(user_id):
  6.     """
  7.     ---
  8.     get:
  9.       description: Get a user by ID
  10.       parameters:
  11.         - name: user_id
  12.           in: path
  13.           required: true
  14.           schema:
  15.             type: integer
  16.       responses:
  17.         200:
  18.           description: A user object
  19.           content:
  20.             application/json:
  21.               schema:
  22.                 type: object
  23.                 properties:
  24.                   id:
  25.                     type: integer
  26.                   name:
  27.                     type: string
  28.     """
  29.     return jsonify({"id": user_id, "name""John Doe"})
  30. docs = FlaskApiSpec(app)
  31. docs.register(get_user)
  32. if __name__ == '__main__':
  33.     app.run()

04Kasus-kasus praktis

Bangun sistem dokumentasi API yang lengkap

1. Pengenalan Proyek

Misalkan kita memiliki sistem manajemen pengguna yang sederhana dan perlu mendokumentasikan API-nya. API kami mencakup operasi penambahan, penghapusan, modifikasi dan kueri pengguna, serta beberapa fungsi otentikasi identitas dasar.

2. Struktur proyek

  1. user_management/
  2. ├── app.py
  3. ├── models.py
  4. ├── views.py
  5. ├── serializers.py
  6. └── requirements.txt

3. Instal dependensi

Tambahkan dependensi di persyaratan.txt:

  1. Flask
  2. Flask-RESTful
  3. Flask-SQLAlchemy
  4. Flask-Migrate
  5. apispec
  6. flask-apispec

Jalankan perintah berikut untuk menginstal dependensi:

pip install -r requirements.txt

4. Tentukan modelnya

Tentukan model pengguna di models.py:

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. class User(db.Model):
  4.     id = db.Column(db.Integer, primary_key=True)
  5.     name = db.Column(db.String(80), nullable=False)
  6.     email = db.Column(db.String(120), unique=True, nullable=False)

5. Tentukan tampilan dan serialisasi

Tentukan serializer pengguna di serializers.py:

  1. from marshmallow import Schema, fields
  2. class UserSchema(Schema):
  3.     id = fields.Int(dump_only=True)
  4.     name = fields.Str(required=True)
  5.     email = fields.Email(required=True)

Tentukan tampilan di views.py:

  1. from flask import request
  2. from flask_restful import Resource
  3. from models import User, db
  4. from serializers import UserSchema
  5. class UserResource(Resource):
  6.     def get(self, user_id):
  7.         user = User.query.get_or_404(user_id)
  8.         schema = UserSchema()
  9.         return schema.dump(user)
  10.     def post(self):
  11.         schema = UserSchema()
  12.         user = schema.load(request.json)
  13.         db.session.add(user)
  14.         db.session.commit()
  15.         return schema.dump(user), 201
  16.     def put(self, user_id):
  17.         user = User.query.get_or_404(user_id)
  18.         schema = UserSchema(partial=True)
  19.         updated_user = schema.load(request.json, instance=user)
  20.         db.session.commit()
  21.         return schema.dump(updated_user)
  22.     def delete(self, user_id):
  23.         user = User.query.get_or_404(user_id)
  24.         db.session.delete(user)
  25.         db.session.commit()
  26.         return ''204

6. Tentukan aplikasi utama

Di app.py:

  1. from flask import Flask
  2. from flask_restful import Api
  3. from flask_migrate import Migrate
  4. from models import db
  5. from views import UserResource
  6. from flask_apispec import FlaskApiSpec
  7. from flask_apispec.extension import FlaskApiSpec
  8. app = Flask(__name__)
  9. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
  10. db.init_app(app)
  11. migrate = Migrate(app, db)
  12. api = Api(app)
  13. api.add_resource(UserResource, '/users/<int:user_id>')
  14. docs = FlaskApiSpec(app)
  15. docs.register(UserResource)
  16. if __name__ == '__main__':
  17.     app.run()

7. Jalankan aplikasi dan lihat dokumentasinya

Mulai aplikasi dengan menjalankan perintah berikut:

python app.py

Kunjungi http://localhost:5000/swagger/ untuk melihat dokumentasi API yang dihasilkan.

05Praktik terbaik

1. Jaga dokumentasi dan kode tetap sinkron

Pastikan dokumentasi selalu sinkron dengan kode untuk menghindari inkonsistensi antara dokumentasi dan API sebenarnya. Anda dapat menggunakan alat CI/CD untuk membuat dan menyebarkan dokumentasi secara otomatis.

2. Gunakan anotasi dan dekorator

Dengan menggunakan komentar dan dekorator, dokumentasi dapat dibuat lebih ringkas dan mudah dibaca. Misalnya, gunakan dekorator @doc Flask-Apispec untuk menambahkan informasi dokumentasi ke fungsi tampilan.

3. Tentukan parameter dan respons global

Untuk parameter dan respons yang umum digunakan, parameter global dan templat respons dapat ditentukan di Apispec untuk mengurangi kode berulang.

  1. spec.components.parameter("user_id""path", schema={"type""integer"}, required=True)
  2. spec.components.response("User", {
  3.     "description""A user object",
  4.     "content": {
  5.         "application/json": {
  6.             "schema": {
  7.                 "type""object",
  8.                 "properties": {
  9.                     "id": {"type""integer"},
  10.                     "name": {"type""string"}
  11.                 }
  12.             }
  13.         }
  14.     }
  15. })

4. Tinjau dan perbarui dokumentasi secara berkala

Tinjau dan perbarui dokumentasi secara berkala untuk memastikan keakuratan dan kelengkapan. Hal ini dapat dicapai dengan menyiapkan siklus peninjauan dokumen atau memperkenalkan proses peninjauan dokumen.

Untuk fungsi lebih lanjut dan penggunaan detail, silakan merujuk ke dokumentasi resmi:

https://apispec.readthedocs.io/en/latest

06ringkasan

Melalui artikel ini, saya yakin Anda memiliki pemahaman dasar dan penguasaan Apispec. Dari penggunaan dasar hingga fungsi lanjutan, hingga kasus praktis dan praktik terbaik, kami memperkenalkan secara komprehensif cara menggunakan Apispec untuk menghasilkan dan memelihara dokumen API.

Saya harap Anda dapat menerapkan pengetahuan ini pada proyek sebenarnya dan menambahkan sentuhan kecerahan pada API Anda.