こんにちは、MSKです。
Web APIを作成した時にAPIをコールしてテストを行うと思います。
そのテストの際に使える方法について紹介したいと思います。
今回使うWEB API
今回使うWeb APIはDjango Rest Frameworkを使って作ります。
Django Rest Frameworkについては以下の記事を参考にしてください。

プロジェクト作成と初期設定
仮想環境を作り、DjangoとDjango Rest Frameworkをインストールします。
python3 -m venv venv
source venv/bin/activate
pip install Django
pip install djangorestframework
プロジェクトを作成し、その中にapiアプリを作成します。
django-admin startproject web_app
cd web_app
django-admin startapp api
apiアプリの中にurls.pyとserializers.pyいう名前でファイルを作成しておきます。
settings.pyにアプリとrestframework、今回は認証関係も使いたいのでrest_framework.authtokenを登録します。
TIME_ZONEもAsia/Tokyoに変更しておきます。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'api.apps.ApiConfig',
]
〜省略〜
TIME_ZONE = 'Asia/Tokyo'
モデル作成とマイグレーション
apiフォルダの中のmodels.pyを以下のようにします。
from django.db import models
class ProductModel(models.Model):
title = models.CharField(max_length=50)
price = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
マイグレーションを行います。
python manage.py makemigrations
python manage.py migrate
管理画面から扱えるように登録をしておきます。
from django.contrib import admin
from .models import ProductModel
admin.site.register(ProductModel)
管理画面に入るためにスーパーユーザーを作っておきます。
python manage.py createsuperuser
ここで一度動作確認をしておきます。
内部のサーバーを立ち上げます。
python manage.py runserver
http://127.0.0.1:8000/adminにアクセスして、先ほど作ったスーパーユーザーでログインします。ProductModelの項目でデータを作成・削除できればOKです。
API作成
シリアライザーを作成します。
apiフォルダ内のserializers.pyに次のように記述します。
from rest_framework import serializers
from .models import ProductModel
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
class ProductModelSerializer(serializers.ModelSerializer):
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M", read_only=True)
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M", read_only=True)
class Meta:
model = ProductModel
fields = ['id', 'title', 'price', 'created_at', 'updated_at']
次にview.pyを準備します。
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from .models import ProductModel
from rest_framework import viewsets
from .serializers import ProductModelSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = ProductModel.objects.all()
serializer_class = ProductModelSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
今回はrest_frameworkのTokenAuthenticationを使って、トークンの生成を行っています。
認証をしなければ、全てのリクエストを許可しないようにしています。
web_appのurls.pyを次のように変更しておきます。
トークンを生成するために、auth/にobtain_auth_tokenを設定しています。
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include('api.urls')),
path('auth/',obtain_auth_token),
]
次にapiフォルダのurls.pyを次のように変更して、アクセス先を定義しています。
from django.conf.urls import include
from django.urls import path
from rest_framework import routers
from .views import ProductViewSet
router = routers.DefaultRouter()
router.register('',ProductViewSet)
urlpatterns = [
path('',include(router.urls))
]
機能が一通りできましたので、runserverします。
次からCURL、POSTMAN、VS CodeのREST Clientを使ってアクセスを行います。
CURLを使う
CURLがインスールされていることを確認します。
バージョンが返されたらインストールされています。
curl -V
CURLを使う場合、次のような形になります。
curl (オプション) (URL)
オプションは複数指定することができます。
今回使うのは以下です。
- -X メソッド名 : 使用するHTTPメソッドを指定します。(GET、POST、PUT、DELETEなど)
- -H 追加するヘッダ情報 : HTTPヘッダに追加します。
- -d POSTするデータ: POSTするデータを追加します。
トークンを取得する
スーパーユーザーでトークンを取得します。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=スーパーユーザー名' -d 'password=パスワード' http://127.0.0.1:8000/auth/
トークンを取得するにはPOSTを使います。
-d でスーパーユーザー名とパスワードを渡しています。
GETしてみる
まずはGETしてみます。
今回は認証を行わないとリクエストは許可されないので、Authorizationをヘッダに含めます。
curl -X GET -H "Authorization: token トークン" http://127.0.0.1:8000/api/
管理者ページで作成したデータを取得することができたと思います。
POSTしてみる
次にデータをPOSTしてみます。
やり方はトークン取得と同じです。
curl -X POST -H "Authorization: token トークン" -d 'title=note' -d 'price=120' http://127.0.0.1:8000/api/
再度GETしてみるとPOSTしたデータを取得することができると思います。
PUTしてみる
上でPOSTしたデータを更新してみます。
curl -X PUT -H "Authorization: token トークン" -d 'title=note' -d 'price=210' http://127.0.0.1:8000/api/2/
DELETEしてみる
上で更新したデータを削除します。
削除するときのメソッドはDELETEです。
curl -X DELETE -H "Authorization: token トークン" http://127.0.0.1:8000/api/2/
POSTMANを使う
インストール
このページからダウンロードします。
Download the Appからダウンロードを行います。

macであればダウンロードしたzipファイルを解凍して、Postmanをアプリケーションフォルダにいれます。
Postmanを起動すると登録を求められますので、登録します。
「Create a request」を選択して、APIを叩く準備をします。
GETしてみる
左上からメソッドを選択します。
今回はGETを選択します。
その右側のテキストボックスにURLを記入します。
その下の項目からHeadersを選択します。
KEYにAuthorizationを、VALUEにトークンを入力します。

入力が終わったら、Sendを押すとアプリ画面下にGETされた内容が表示されます。

POSTしてみる
次にPOSTを行います。メソッドをPOSTにします。
Headersはそのままにして、Bodyを選択します。
KEYにtitleとpriceを、VALUEにそれぞれに設定する値を入力します。
入力が終わったら、Sendを押します。

POSTした内容がアプリ画面下に表示されます。

PUTしてみる
メソッドをPUTにします。
URLの最後に更新するidを追記します。
(上のPOSTした内容を変えたいのでこの場合はhttp://127.0.0.1:8000/api/5/)
Bodyに更新する内容を入力します。
入力が終わったら、Sendを押します。

DELETEしてみる
メソッドをDELETEを選択します。
URLには削除するidを最後に追加します。
Sendを押すと削除が実行されます。

REST Clientを使う
インストール
Visual Studio Codeの拡張機能から「REST Client」と検索すると次の拡張機能が出てくると思いますので、インストールします。

test.httpというファイルを作ります。
GETしてみる
GETは次のように行います。
GET http://127.0.0.1:8000/api/ HTTP/1.1
Authorization: token トークン
POSTしてみる
POSTは次のように行います。
POST http://127.0.0.1:8000/api/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: token トークン
title=tea&price=120
PUTしてみる
PUTは次のように行います。
PUT http://127.0.0.1:8000/api/4/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: token トークン
title=tea&price=150
DELETEしてみる
最後にDELETEを行います。
DELETE http://127.0.0.1:8000/api/4/ HTTP/1.1
Authorization: token トークン
最後に
WEB APIにアクセスを行うことができるツールを紹介しました。
僕は個人的にはREST Clientが好きで使っていますが、仕事などではCURLやPostmanを使うことが多いように思えます。
最後までご覧いただき、ありがとうございました。
以上、「Web APIへのアクセスをいろんな方法で試してみよう」でした。