informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Daftar isi
Hasilkan dokumentasi API sederhana
2. Tentukan rute dan tampilan API
Integrasikan Flask dan APIspec
1. Instal Flask dan Flask-Apispec
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
6. Hasilkan spesifikasi OpenAPI
2. Mendukung berbagai kerangka kerja
3. Secara otomatis menghasilkan dokumen antarmuka
4. Integrasikan dengan alat pihak ketiga
5. Tentukan tampilan dan serialisasi
7. Jalankan aplikasi dan lihat dokumentasinya
Kunjungi http://localhost:5000/swagger/ untuk melihat dokumentasi API yang dihasilkan.
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.
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.
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
Mari kita lihat penggunaan dasar Apispec melalui beberapa contoh sederhana.
- from apispec import APISpec
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- info=dict(description="This is a sample API"),
- )
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
- spec.path(
- path="/users/{user_id}",
- operations=dict(
- get=dict(
- description="Get a user by ID",
- parameters=[
- {
- "name": "user_id",
- "in": "path",
- "required": True,
- "schema": {"type": "integer"},
- }
- ],
- responses={
- "200": {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"},
- },
- }
- }
- },
- }
- },
- )
- ),
- )
pip install Flask Flask-Apispec
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec, doc, marshal_with
- from flask_apispec.views import MethodResource
- from marshmallow import Schema, fields
-
- app = Flask(__name__)
-
- class UserSchema(Schema):
- id = fields.Int()
- name = fields.Str()
-
- class UserResource(MethodResource):
- @doc(description='Get a user by ID', tags=['User'])
- @marshal_with(UserSchema)
- def get(self, user_id):
- return {"id": user_id, "name": "John Doe"}
-
- app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- @app.route('/swagger/')
- def swagger_ui():
- return jsonify(docs.spec.to_dict())
-
- if __name__ == '__main__':
- app.run()
pip install django djangorestframework
- django-admin startproject myproject
- cd myproject
- django-admin startapp myapp
Tambahkan rest_framework dan apispec di settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
Di myapp/views.py:
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.schemas import AutoSchema
-
- class UserView(APIView):
- schema = AutoSchema(
- manual_fields=[
- coreapi.Field('user_id', required=True, location='path', schema={'type': 'integer'})
- ]
- )
-
- def get(self, request, user_id):
- """
- Get a user by ID.
- ---
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return Response({"id": user_id, "name": "John Doe"})
Di myapp/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
Di kelola.py:
- from apispec import APISpec
- from rest_framework.schemas import get_schema_view
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- )
-
- schema_view = get_schema_view(title="My API")
- schema = schema_view.get_schema(request=None, public=True)
- spec.components.schema('User', schema)
- spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
-
- print(spec.to_yaml())
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.
- from apispec import BasePlugin
-
- class MyPlugin(BasePlugin):
- def path_helper(self, operations, *, resource, **kwargs):
- operations.update({
- 'get': {
- 'description': 'Get a user by ID',
- 'parameters': [
- {'name': 'user_id', 'in': 'path', 'required': True, 'schema': {'type': 'integer'}}
- ],
- 'responses': {
- '200': {
- 'description': 'A user object',
- 'content': {
- 'application/json': {
- 'schema': {
- 'type': 'object',
- 'properties': {
- 'id': {'type': 'integer'},
- 'name': {'type': 'string'}
- }
- }
- }
- }
- }
- }
- }
- })
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- plugins=[MyPlugin()],
- )
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.
Apispec dapat secara otomatis menghasilkan dokumen antarmuka berdasarkan string dokumentasi suatu fungsi atau kelas, sehingga mengurangi beban kerja penulisan dokumen secara manual.
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
Apispec dapat diintegrasikan dengan banyak alat pihak ketiga, seperti Swagger UI, ReDoc, dll., untuk menyediakan tampilan dokumen antarmuka yang intuitif dan fungsi pengujian.
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec
-
- app = Flask(__name__)
-
- @app.route('/users/<int:user_id>', methods=['GET'])
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return jsonify({"id": user_id, "name": "John Doe"})
-
- docs = FlaskApiSpec(app)
- docs.register(get_user)
-
- if __name__ == '__main__':
- app.run()
Bangun sistem dokumentasi API yang lengkap
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.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Tambahkan dependensi di persyaratan.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Jalankan perintah berikut untuk menginstal dependensi:
pip install -r requirements.txt
Tentukan model pengguna di models.py:
- from flask_sqlalchemy import SQLAlchemy
-
- db = SQLAlchemy()
-
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(80), nullable=False)
- email = db.Column(db.String(120), unique=True, nullable=False)
Tentukan serializer pengguna di serializers.py:
- from marshmallow import Schema, fields
-
- class UserSchema(Schema):
- id = fields.Int(dump_only=True)
- name = fields.Str(required=True)
- email = fields.Email(required=True)
-
Tentukan tampilan di views.py:
- from flask import request
- from flask_restful import Resource
- from models import User, db
- from serializers import UserSchema
-
- class UserResource(Resource):
- def get(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema()
- return schema.dump(user)
-
- def post(self):
- schema = UserSchema()
- user = schema.load(request.json)
- db.session.add(user)
- db.session.commit()
- return schema.dump(user), 201
-
- def put(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema(partial=True)
- updated_user = schema.load(request.json, instance=user)
- db.session.commit()
- return schema.dump(updated_user)
-
- def delete(self, user_id):
- user = User.query.get_or_404(user_id)
- db.session.delete(user)
- db.session.commit()
- return '', 204
Di app.py:
- from flask import Flask
- from flask_restful import Api
- from flask_migrate import Migrate
- from models import db
- from views import UserResource
- from flask_apispec import FlaskApiSpec
- from flask_apispec.extension import FlaskApiSpec
-
- app = Flask(__name__)
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
- db.init_app(app)
- migrate = Migrate(app, db)
- api = Api(app)
-
- api.add_resource(UserResource, '/users/<int:user_id>')
-
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- if __name__ == '__main__':
- app.run()
Mulai aplikasi dengan menjalankan perintah berikut:
python app.py
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.
- spec.components.parameter("user_id", "path", schema={"type": "integer"}, required=True)
- spec.components.response("User", {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"}
- }
- }
- }
- }
- })
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
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.