SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Django REST Framework (DRF)でWeb-APIプロキシを作るサンプル

f:id:arakan_no_boku:20190909212423j:plain
 目次

WebAPIプロキシ

プロキシは英語で「proxy」と書きます。

日本語だと「代理」「中継」みたいな意味で、ネットワークの内部と外部をつなぐ役割をもつ「プロキシサーバー」などでよく知られています。

WebAPIプロキシは既存のWeb-APIを内部で呼び出して結果をそのまま返す手法です。

例えば、個別のJavaScriptで使い方の異なる複数のWebAPIを処理するのではなく、いったん中継することで、JavaScriptからみたインタフェースを統一するような使い方をすることで、保守性や拡張性を担保することができたりします。

今回は、API-KEYの受け渡しが必要なWeb-APIを中継する「WebAPIプロキシ」をDjango REST Framework (以後、DRF)で作ります。

なお、DRFで、Web-APIプロキシを作る方法は以下の記事に一度書いています。

arakan-pgm-ai.hatenablog.com

ただ、こちらはAPI-KEYの必要がないAPIを使用しました。

今回は、API-KEYの指定が必要なAPIを利用する方法となります。

使うAPIは「地域経済分析システムAPI

利用には「登録(無料)が必要」です。

登録には、メールアドレスと名前と市区町村レベルの所在地が必要です。

以下の概要で一覧が見れますが、このAPIからとれる情報はものすごく多いです。

https://opendata.resas-portal.go.jp/docs/api/v1/index.html

f:id:arakan_no_boku:20190902203127p:plain

今回は、「都道府県一覧 api/v1/prefectures」と「市区町村一覧 api/v1/cities」を使います。

登録して送られてくる「API-KEY」をリクエストヘッダー「X-API-KEY」にセットして、利用する必要があります。

都道府県コード一覧取得のWEB-APIプロキシサンプル

都道府県コードの一覧を取得するソースコードです。

API-KEYを「  headers = {'X-API-KEY': 'noxxxxxxxxxjK'}」のように渡している部分がポイントです。 

prefectures_api.py

import requests
from rest_framework.views import APIView
from rest_framework.response import Response


class Prefectures(APIView):

    def get(self, request):
        headers = {'X-API-KEY': 'noxxxxxxxxxjK'}
        resp = requests.get(
            'https://opendata.resas-portal.go.jp/api/v1/prefectures',
            headers=headers)
        return Response(resp.json(), status=resp.status_code)

市区町村コード一覧取得のWEB-APIプロキシサンプル

都道府県コードをキーに、市区町村一覧を取得する処理です。

API-KEYと絞り込みキーとして、都道府県コードを渡す必要があります。

API-KEYは、「headers = {'X-API-KEY': 'XXXXXXXXXXXXXXXXXXXXXXXXX'}」のように渡します。

都道府県コードなどのパラメータは「 params = {'prefCode': pref_code}」のように渡します。

ソースコードはこんな感じです。

municipalities_api.py

import requests
from rest_framework.views import APIView
from rest_framework.response import Response


class Municipalities(APIView):

    def get(self, request):
        pref_code = request.GET.get(key="prefCode", default="13")
        headers = {'X-API-KEY': 'noXXXXXXXXXXXXXXXXXTaGVjX1u7IvakZUf9MBcwOjK'}
        params = {'prefCode': pref_code}
        resp = requests.get(
            'https://opendata.resas-portal.go.jp/api/v1/cities',
            headers=headers,
            params=params)
        return Response(resp.json(), status=resp.status_code)

ポイントはパラメータを受けるところと、パラメータを渡すところです。 

デフォルトは「13」(つまり東京)にしています。

URLSの構成とサンプル実行結果確認

クラスベースで実装したAPIは、urls.pyに以下のように登録して使います。

urls.py

from django.contrib import admin
from django.urls import path
from . import views
from . import adress_from_zip as zip
from . import prefectures_api as pref
from . import municipalities_api as city

urlpatterns = [
    path(
        'admin/',
        admin.site.urls),
    path(
        'api/v1/addresses/zip/get',
        zip.AddressFromZip.as_view(),
        name='cls-v'),
    path(
        'api/v1/prefectures',
        pref.Prefectures.as_view(),
        name='pref-v'),
    path(
        'api/v1/cities',
        city.Municipalities.as_view(),
        name='city-v'),
]

例えば、市区町村コード取得の場合だと。 

http://localhost:8000/api/v1/cities?prefcode=10

 のように使います。

実際のRESASのAPIコールのURLは

https://opendata.resas-portal.go.jp/api/v1/cities?prefCode=10

 なので、ドメイン以外のURLやパラメータ名はあわせてやるようにしてます。

取得した結果はこんな感じ。

f:id:arakan_no_boku:20190902234709p:plain

APIを直接処理した場合と同じようなJSONが返せています。

よしよし。

今回はheadersやparamsを使う「Web-APIプロキシ」を試しにやってみました。

今回はこんなところで。

ではでは。