プログラミング

Web APIへのアクセスをいろんな方法で試してみよう!

こんにちは、MSKです。
Web APIを作成した時にAPIをコールしてテストを行うと思います。
そのテストの際に使える方法について紹介したいと思います。

今回使うWEB API

今回使うWeb APIはDjango Rest Frameworkを使って作ります。
Django Rest Frameworkについては以下の記事を参考にしてください。

Django Rest Frameworkを使ってみよう! こんにちは、MSKです。最近はバックエンドとフロントエンドを別々に開発することが主流になっています。Pythonでそのような開発を行う...

プロジェクト作成と初期設定

仮想環境を作り、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)

オプションは複数指定することができます。
今回使うのは以下です。

  1. -X メソッド名 : 使用するHTTPメソッドを指定します。(GET、POST、PUT、DELETEなど)
  2. -H 追加するヘッダ情報 : HTTPヘッダに追加します。
  3. -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へのアクセスをいろんな方法で試してみよう」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近Webプログラミングと曲面結び目理論にはまっています。