デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - APIを使ってみよう!郵便番号から住所を一括取得するには? ~GET Request / String to JSON / JSON to Table~

f:id:makkynm:20210418231904p:plain

 

 

はじめに

こんにちは、自動化大好きまっきーです。 今回は、自動化の幅が格段に広がる、APIを使ってみたいと思います。

今回、解説するところが盛りだくさんなので、もしわからなかったら、用語を一つ一つGoogle検索していってください。

 

 今回のテーマ ~GET Request~

f:id:makkynm:20210417091215p:plain

 今回のテーマ ~GET Request~

今回、「API」「Get Request」「JSON」というのがキーワードになります。まずはそちらの用語を解説してから本題に移りたいと思います。

郵便番号検索API - zipcloud

 

覚えてほしいこと

APIを使うのは意外と簡単!

 

やりたいこと

郵便番号から住所を一括で取得する!

f:id:makkynm:20210417095801p:plain

やりたいこと - 郵便番号から住所を取得

 

郵便番号から住所を検索するとき、みなさんどのように行っていますか?色々方法はあると思いますが、今回はKNIMEで郵便番号検索APIを使って、郵便番号から住所を一括で取得する方法について解説したいと思います。

 

APIとは?

さて、何度か聞いたことがあるかもしれません、APIとはなんでしょうか。

APIとは、「Application Programming Interface」の略で、「アプリケーションとプログラミングを繋ぐもの」という意味を示しています。

何かアプリケーションがあったときに、外部にAPIという窓口があるイメージで、その窓口を通して情報が簡単にやりとりできるようになります。

例えば、自分で何かを開発していて、地図を表示したいと思った時、一から地図を開発するのって大変ですよね。そこで、Google Mapが提供しているAPIを使おう!ってなるわけです。APIを使うと、自分で一から地図を開発することなく、すでに充実した機能を持つGoogle Mapを簡単に自分のアプリに統合することができ、自分で開発する必要がなくなるので時間を節約することができます。

今回の場合、「郵便番号データ配信サービス」というアプリケーションがあり、その1つの外部の窓口である「郵便番号検索APIというのを使用します。

このAPIを使用することで、郵便番号と住所の関連を簡単に自分のKNIMEワークフローに取り込むことができます。

 

 

GET Request と POST Requestの違いについて

Request・Responseとは?

いきなり、GET?POST?となったかもしれません。解説していきます。

そもそも、Requestとは、「お願いする」ことです。英語の直訳ですね。それに対する返答をResponseと言います。ITの分野では、どこかのインターネットサーバーにお願いすることを「Request」、その応答を「Response」と呼んでいたりします。

 

GET Request と POST Requestの違いは?

そして、Requestの方法が2種類あります。Get RequestとPost Requestです。

この違いは下記のサイトが分かりやすかったので引用します。

1つ目は役割の違い

役割の違い

HTTP GET:指定したURLの内容をWebサーバから取り出す(GET)

HTTP POST:クライアントが入力した内容をWebサーバに送る(POST)

2つ目は、リクエストパラメータの送信方法の違い

送信方法の違い

HTTP GET:URLに連結して送信

HTTP POST:HTTP Bobyに格納して送信

引用:HTTP GETとPOSTの違い - ITを分かりやすく解説

 

Get Requestのイメージ

URLがファイルパスのような役割をしていて、サーバー側はURLにあるファイルを返しているイメージです。検索条件等もURLに違いが現れます。

サーバーから返ってくるファイルは、URLによって変わります。htmlファイルのこともあれば、XMLファイルやPDFファイルのこともあります。

f:id:makkynm:20210414082457p:plain

Get Request "HTML"

f:id:makkynm:20210414082613p:plain

Get Request "XML"
Post Requestのイメージ

一方、Post Requestはサーバー側で作業してから返すイメージです。

f:id:makkynm:20210414084007p:plain

Post Request

 

JSONとは?

JSONとは、データの形式の名前です。こんなデータフォーマットです!というのが一番分かりやすいと思うので、それをお見せします。

{
    "address1": "東京都",
    "address2": "千代田区",
    "address3": "丸の内",
    "kana1": "トウキョウト",
    "kana2": "チヨダク",
    "kana3": "マルノウチ",
    "prefcode": "13",
    "zipcode": "1000005"
}

 

こんな形式でデータを記述していく方式をJSON方式と呼びます。

データの項目とデータの内容が1:1になっているイメージですね。

もし、データの中身が複数になる場合は、[ ] で囲んで配列を作ることによって複数も表現することができます。

こんな形式のデータをみたら、「JSONね」と思うくらいの気楽さで問題ないです。JSON形式であるということだけ分かればOKです。

 

やりたいこと - 全体の方針

API、Get Request、JSON についてなんとなく分かりましたか?

ここからは実際の使い方について解説していきたいと思います。

今回のやりたいことは、郵便番号から住所を取得することでした。

その手法として、郵便番号検索APIを使っていきます。

郵便番号検索APIにRequest(郵便番号情報)をすると、郵便番号検索APIがResponse(住所情報)をしてくれるという仕組みを使います。

f:id:makkynm:20210418191845p:plain

郵便番号検索APIのイメージ

郵便番号検索APIはGet Request形式で、ResponseはJSON形式のデータを返してきます。

この文章の意味分かりましたか、、?

 

さて、この前提条件を踏まえて全体の手順はこんな形です。

  1. URLを作成(Get Request用)
  2. 郵便番号検索APIにGET Requestを行う(郵便番号を送信)
  3. 郵便番号検索APIからResponseをもらう(住所情報を取得)
  4. 形式を変換する(JSONからKNIMEのテーブル形式に変換)

 

f:id:makkynm:20210418194230p:plain

やりたいこと - 全体の方針

 

郵便番号検索APIの使い方

まず、使い方だけ郵便番号検索APIの使い方について簡単に押さえておきます。

郵便番号検索API - zipcloud

郵便番号検索APIを使うには、下のようなURLを作る必要があります。

https://zipcloud.ibsnet.co.jp/api/search?zipcode=郵便番号7桁

例えば東京駅の郵便番号1000005を使用するとすると、

https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000005

となります。

これをWebブラウザに入力してみてください。JSON形式でレスポンスが返ってくると思います。

f:id:makkynm:20210418211300p:plain

郵便番号検索API Response例 - 東京駅の郵便番号

これを取得できればStep3までクリアです。簡単ですよね。

ちなみに住所のほかに、都道府県コードや郵便番号も返ってきてます。

 

Step1 - GET Request用 URLを作成

f:id:makkynm:20210418194416p:plain

Step1 - GET Request用 URLを作成

さて、まずはURLを作っていきましょう。

ここで使うのはString ManipulationのJoinという関数です。なんだそれ?という方は下記の記事をご覧ください。

degitalization.hatenablog.jp

 

今回は例なので、Table Creatorで住所を取得したい郵便番号の一覧を作っていきます。ExcelCSVで作ってReaderで読み込んでも構いません。

f:id:makkynm:20210418212036p:plain

Table Creator のOutput - 郵便番号一覧

次に、String ManipulationのJoin関数を使用して、文字結合させます。

join("https://zipcloud.ibsnet.co.jp/api/search?zipcode=",$郵便番号$)

f:id:makkynm:20210418212305p:plain

String Manipulation - URLの作成

これでURLが作成できました。

f:id:makkynm:20210418212455p:plain

String Manipulation - URLの作成

Step2,3 - 郵便番号検索APIを使う - GET Requestの使い方

さて、次に郵便番号検索APIに郵便番号を送信して、住所情報をもらいましょう。

  • 郵便番号検索APIにGET Requestを行う(郵便番号を送信)
  • 郵便番号検索APIからResponseをもらう(住所情報を取得)

KNIMEのGET Request Nodeで設定する部分は数項目で問題ないです。なので非常にシンプルかと思います。

ただしオプションがたくさんあるので、細かい使い方をしようとするとややこしいかもしれませんね。

Workflow - Get Request

f:id:makkynm:20210418214426p:plain

Workflow - GET Request

Workflowは下記からダウンロードできます。

APIを使ってみる - Get Request – KNIME Hub

 

Confirm - Get Request

3つコラムが出てきます。

Bodyのコラム名はConfigureで変更可能です。また、Responseの種類に応じて、自動的にKNIMEのデータ型に変換してくれることもあります。(今回はJSON型に自動で変換してくれなかったようです)

  • Status:Request処理が成功したか?ステータスコードという3桁の数字
  • Content type:データの種類についての情報。HTMLなのか画像なのか? 文字コードなど
  • body:Responseの内容

f:id:makkynm:20210418214452p:plain

Confirm - GET Request
Status Codeの種類

ステータスコードは、3桁の数字で表され、番号によって意味が決まっています。下記引用です。

  • 200番台は成功
    • 200:OK、データを送ります
  • 300番台はリダイレクト
    • 301:新しい場所から取得してください(今後もずっと)
    • 302:新しい場所から取得してください(今回だけ)
    • 304:変更されていません(データ本体は送られない)
  • 400番台はクライアント側のエラー
    • 401:ユーザー認証が必要です
    • 403:アクセスが禁止されています
    • 404:見つかりませんでした
  • 500番台はサーバー側のエラー

 

Configure - GET Request

さて、GET RequestのConfigureです。設定可能なOptionはたくさんありますが、今回は必要な部分についてのみ解説したいと思います。

f:id:makkynm:20210418221256p:plain

Configure - GET Request

 

1. URLの指定

まずはURLを指定します。URLの指定方法は2つあります。

  1. 直接打ち込む
  2. URLのコラムを指定する

URLが1つだけの場合は直接指定でも良いですが、オススメはコラムを作って指定する方法です。今回はURLのコラムを事前に作ってあるため、そのコラムを指定しています。

 

2. 遅延時間の指定

大量のリクエストを短時間に送信してしまうと、相手サーバーに負荷がかかってしまい、サイバー攻撃をしているようになってしまいます。

一歩間違えると犯罪になってしまうんです。興味がある方は「Librahack事件」で調べてみてください。

そこで、遅延処理を入れることが必須となっています。単位が「ms」なので、今回は2秒の間隔を意図的に空けるために「2000 ms」にしました。

 

3. その他

さて、このほかにもたくさんオプションがありますが、1, 2さえ行っておけば動きます。そのほか、Body Columnの部分でコラム名が変えられたりしますが、、、

あまり使わないですね。そのほかのオプションについては知りたい人はちょっと一言を見てください。

 

Step4 - データ型を変換する

さて、最後にデータ型を変換していきます。現在JSON形式でデータがありますが、それぞれのデータをKNIMEのコラムに変換していきたいと思います。

まずは、Responseで受け取ったデータフォーマットがJSONにも関わらず、Stringで取り込まれてしまっていることから、まずはJSON形式にデータ型を変えていきましょう。

Step4.1 - StringからJSONへ ~String to JSON~

ただのデータ型変換です。

Confirm - String to JSON

f:id:makkynm:20210418225231p:plain

Step4.1 - StringからJSON

Configure - String to JSON
まずはInput columnでコラムを指定します。また、新規でコラムを作成するか上書きするかも選択しましょう。

基本はこれで終了です。

その他のOptionは下記の通りです。

  • Allow commentsJSONのなかに、コメントがあった場合に対処するオプションです。コメントは下記のように表されます。Comments /*...*/, and line comments // and # 
  • Fail on error:変換が失敗した場合にエラーとして止めるか、欠損値として扱うかです。チェックを入れるとエラーとして止まります。

f:id:makkynm:20210418225411p:plain

Configure - String to JSON

 

Step4.2 - JSONからKNIMEのテーブルへ ~JSON to Table~

続いてもデータフォーマット変換です。こちらは非常に便利ですね。セル分割にやっていることは近いです。

Confirm - JSON to Table

f:id:makkynm:20210418230244p:plain

Step4.2 - JSONからKNIMEのテーブルへ

 

Configure - JSON to Table
かなりオプション盛りだくさんなのですが、どれも任意項目なので設定なしでOKです。

解説がかなり長くなってしまったので、この部分は省略します。すみません。

気になる方はNode Pit見てみてください!

f:id:makkynm:20210418230455p:plain

Configure - JSON to Table

 

 

 

 ちょっと一言

GET Requestその他のオプション

Connection Settings - 接続設定
  • Concurrency:2以上にすると、同時にリクエストを投げることができます。
  • Ignore hostname mismatches:チェックを入れると、ホスト名が異なっていてもサーバーのSSL証明を信頼します。
  • Trust all certificates:チェックを入れると、有効期限やソース元にかかわらず、全ての証明を信頼します。
  • Fail on connection problems (e.g. timeout, certificate errors, …):通常はStatus Codeで判断されるものですが、これにチェックを入れるとリクエストが失敗した場合Nodeの実行ステータスをFailedにすることができます。
  • Fail on http errors (e.g. page not found)ステータスコードが4xx and 5xxのエラーだった場合にNodeのステータスをFailedにします。
  • Follow redirects:チェックを入れると、ステータスコードが3xxだった場合にリダイレクトします。
  • Timeout (s):レスポンスが返ってこない場合にタイムアウトする設定です。
  • Body:Outputのコラムの名前です。

Authentication - 認証設定
  • Type:認証タイプの選択
  • Use credentials:チェックを入れると、ユーザネームとパスワードを変数等の別Nodeで指定していた場合にそれを使用できます。この方法が推奨されています。例えば下記のNodeが使用できます。

f:id:makkynm:20210418223454p:plain

Use credentials - Credentials Configuration
  • Username:ユーザネームの入力
  • Password:パスワードの入力
Request Headers - リクエストヘッダ

Connection Settingsで基本十分ですが、自分で細かく指定したい人はこちらを使うことができます。

f:id:makkynm:20210418223939p:plain

Request Headers - Merge
  • Merge:選択したTemplateのRequest Headerの項目を一括で追加することが可能です。
  • Replace:選択したTemplateのRequest Headerの項目で既存のリクエストヘッダを置換します。
  • Header key:HTTPリクエストヘッダのヘッダキーの部分。 e.g. Accept or X-Custom-Key.
  • Header value:HTTPリクエストヘッダの値の部分
  • Header kind:HTTPリクエストヘッダの値の種類
Response Headers - レスポンスヘッダ
  • Extract all fields:チェックを入れると、全てのResponseのヘッダ情報が抽出されます
  • Header key:抽出したいResponseのヘッダキーを指定します。
  • Header type:レスポンスの列のデータ型を指定します。

 

おわりに

 お疲れ様でした!今回かなり盛りだくさんな内容になってしまいましたが、いかがだったでしょうか。

分かりにくい部分多々あったと思うので、ぜひコメント等いただけると嬉しいです。また、リクエストの部分の説明もかなり端折って書いてしまっている部分もあります。ぜひ何かお気づきのことがあればぜひ教えてください。ではまた!

 

 

 

 

余談 

最近、ソロキャンだったり写真・動画作成だったり、運動だったりたくさん趣味がありすぎて欲しいものを買うにはお金がいくらあっても足りません。。。

いい感じでコスパ良く暮らしたいものです。ではまた!

 

 

KNIMEに関する本

KNIMEに関する日本語の本って今これくらいしかないと思うんですよね、、

本がいいなーと言う人はぜひ試してみてください。

 

参考リンク