REST APIとは?
RESTの基本概念
REST(Representational State Transfer)とは、Webサービスの設計に使われるアーキテクチャスタイルです。REST APIは、HTTPプロトコルを使ってクライアントとサーバー間でデータをやり取りするためのエンドポイントを提供します。
REST APIの特徴
- HTTPメソッドを活用: GET、POST、PUT、DELETEなどのHTTPメソッドを利用してリソースの操作を行います。
- ステートレス(Stateless): 各リクエストは独立しており、サーバー側にユーザーのセッション情報を保持しません。
- リソース指向: リソースはURLで一意に識別され、データは主にJSON形式で送受信されます。
RESTの基本操作
HTTPメソッド | 操作 | 説明 |
---|---|---|
GET | 読み込み(Retrieve) | データの取得 |
POST | 作成(Create) | 新しいリソースの作成 |
PUT | 更新(Update) | 既存のリソースの更新 |
DELETE | 削除(Delete) | リソースの削除 |
例:
- GET
/api/posts/
(すべての投稿を取得) - POST
/api/posts/
(新しい投稿を作成) - PUT
/api/posts/1/
(ID=1の投稿を更新) - DELETE
/api/posts/1/
(ID=1の投稿を削除)
DjangoでのREST APIのセットアップ
必要なパッケージのインストール
DjangoでREST APIを作成する際に便利なライブラリとして、Django REST framework(DRF)があります。
DRFのインストール:
pip install djangorestframework
settings.pyの設定
インストールしたら、INSTALLED_APPS
にrest_framework
を追加します。
settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 追加
]
モデルの作成
モデルの基本定義
REST APIでデータを管理するためには、まずDjangoのモデルを定義します。ここでは、ブログ投稿(BlogPost)を例にします。
models.py:
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
- title: 投稿のタイトルを保存するフィールド。
- content: 投稿の内容を保存するフィールド。
- created_at, updated_at: 自動で生成・更新される日時情報。
マイグレーションの適用
モデルを作成したら、データベースに反映するためにマイグレーションを実行します。
python manage.py makemigrations
python manage.py migrate
シリアライザの作成
シリアライザとは?
シリアライザは、データベースのモデルインスタンスをJSONなどのフォーマットに変換するためのものです。また、逆にJSONデータをモデルインスタンスに変換することも可能です。
serializers.py:
from rest_framework import serializers
from .models import BlogPost
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
fields = ['id', 'title', 'content', 'created_at', 'updated_at']
ModelSerializer
: モデルを元にシリアライザを自動生成する便利なクラスです。fields
: シリアライズ対象のフィールドを指定します。
APIビューの作成
関数ベースビュー(FBV)でのAPIエンドポイント
まずはシンプルな関数ベースビューを使ったAPIの例を見ていきます。
views.py:
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import BlogPost
from .serializers import BlogPostSerializer
@api_view(['GET', 'POST'])
def blog_post_list(request):
if request.method == 'GET':
posts = BlogPost.objects.all()
serializer = BlogPostSerializer(posts, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = BlogPostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
api_view
: このデコレーターを使って、関数ベースビューをAPIエンドポイントにします。- GETリクエスト: すべてのブログ投稿を取得して返します。
- POSTリクエスト: 新しい投稿を作成します。
クラスベースビュー(CBV)でのAPIエンドポイント
Django REST frameworkでは、より簡潔にAPIを定義できるクラスベースビューも用意されています。
views.py:
from rest_framework import generics
from .models import BlogPost
from .serializers import BlogPostSerializer
class BlogPostListCreateView(generics.ListCreateAPIView):
queryset = BlogPost.objects.all()
serializer_class = BlogPostSerializer
ListCreateAPIView
: GETとPOSTの両方を処理するための汎用ビュークラスです。
URLの設定
ルーティングの追加
APIエンドポイントを設定するために、urls.py
にパスを追加します。
urls.py:
from django.urls import path
from .views import blog_post_list, BlogPostListCreateView
urlpatterns = [
# 関数ベースビュー
path('api/posts/', blog_post_list, name='blog_post_list'),
# クラスベースビュー
path('api/posts/cbv/', BlogPostListCreateView.as_view(), name='blog_post_cbv_list')
]
APIの動作確認
開発サーバの起動
次のコマンドで開発サーバを起動します。
python manage.py runserver
APIリクエストの送信
ブラウザまたはAPIクライアント(PostmanやcURLなど)を使用してエンドポイントにアクセスします。
- GETリクエスト(すべての投稿を取得):
curl -X GET http://127.0.0.1:8000/api/posts/
- POSTリクエスト(新しい投稿を作成):
curl -X POST http://127.0.0.1:8000/api/posts/ -H "Content-Type: application/json" -d '{"title": "新しい投稿", "content": "Django REST frameworkの学習中です。"}'
認証と認可の追加
認証の基本設定
Django REST frameworkには、さまざまな認証システムが組み込まれています。
例:基本認証の有効化 settings.py:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
これにより、認証されたユーザーのみがAPIにアクセスできます。
トークン認証の導入
トークン認証を使うことで、より安全な認証を実現できます。
pip install djangorestframework-simplejwt
まとめ
Django REST frameworkを使えば、簡単にAPIエンドポイントを構築することができます。シリアライザを使ったデータの変換、ビューによるリクエスト処理、認証の追加といった基本的な構成を理解すれば、REST APIの開発がスムーズに進みます。