目次
WebAPIプロキシ
プロキシは英語で「proxy」と書きます。
日本語だと「代理」「中継」みたいな意味で、ネットワークの内部と外部をつなぐ役割をもつ「プロキシサーバー」などでよく知られています。
WebAPIプロキシは既存のWeb-APIを内部で呼び出して結果をそのまま返す手法です。
例えば、個別のJavaScriptで使い方の異なる複数のWebAPIを処理するのではなく、いったん中継することで、JavaScriptからみたインタフェースを統一するような使い方をすることで、保守性や拡張性を担保することができたりします。
今回は、API-KEYの受け渡しが必要なWeb-APIを中継する「WebAPIプロキシ」をDjango REST Framework (以後、DRF)で作ります。
なお、DRFで、Web-APIプロキシを作る方法は以下の記事に一度書いています。
ただ、こちらはAPI-KEYの必要がないAPIを使用しました。
今回は、API-KEYの指定が必要なAPIを利用する方法となります。
使うAPIは「地域経済分析システムAPI」
利用には「登録(無料)が必要」です。
登録には、メールアドレスと名前と市区町村レベルの所在地が必要です。
以下の概要で一覧が見れますが、このAPIからとれる情報はものすごく多いです。
https://opendata.resas-portal.go.jp/docs/api/v1/index.html
今回は、「都道府県一覧 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'), ]
例えば、市区町村コード取得の場合だと。
のように使います。
実際のRESASのAPIコールのURLは
https://opendata.resas-portal.go.jp/api/v1/cities?prefCode=10
なので、ドメイン以外のURLやパラメータ名はあわせてやるようにしてます。
取得した結果はこんな感じ。
APIを直接処理した場合と同じようなJSONが返せています。
よしよし。
今回はheadersやparamsを使う「Web-APIプロキシ」を試しにやってみました。
今回はこんなところで。
ではでは。