- はじめに
- 覚えてほしいこと
- やりたいこと
- APIとは?
- GET Request と POST Requestの違いについて
- JSONとは?
- やりたいこと - 全体の方針
- Step1 - GET Request用 URLを作成
- Step2,3 - 郵便番号検索APIを使う - GET Requestの使い方
- Step4 - データ型を変換する
- ちょっと一言
- おわりに
- KNIMEに関する本
- 参考リンク
はじめに
こんにちは、自動化大好きまっきーです。 今回は、自動化の幅が格段に広がる、APIを使ってみたいと思います。
今回、解説するところが盛りだくさんなので、もしわからなかったら、用語を一つ一つGoogle検索していってください。
今回のテーマ ~GET Request~
今回、「API」「Get Request」「JSON」というのがキーワードになります。まずはそちらの用語を解説してから本題に移りたいと思います。
覚えてほしいこと
APIを使うのは意外と簡単!
やりたいこと
郵便番号から住所を一括で取得する!
郵便番号から住所を検索するとき、みなさんどのように行っていますか?色々方法はあると思いますが、今回は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ファイルのこともあります。
Post Requestのイメージ
一方、Post Requestはサーバー側で作業してから返すイメージです。
JSONとは?
JSONとは、データの形式の名前です。こんなデータフォーマットです!というのが一番分かりやすいと思うので、それをお見せします。
こんな形式でデータを記述していく方式をJSON方式と呼びます。
データの項目とデータの内容が1:1になっているイメージですね。
もし、データの中身が複数になる場合は、[ ] で囲んで配列を作ることによって複数も表現することができます。
こんな形式のデータをみたら、「JSONね」と思うくらいの気楽さで問題ないです。JSON形式であるということだけ分かればOKです。
やりたいこと - 全体の方針
API、Get Request、JSON についてなんとなく分かりましたか?
ここからは実際の使い方について解説していきたいと思います。
今回のやりたいことは、郵便番号から住所を取得することでした。
その手法として、郵便番号検索APIを使っていきます。
郵便番号検索APIにRequest(郵便番号情報)をすると、郵便番号検索APIがResponse(住所情報)をしてくれるという仕組みを使います。
郵便番号検索APIはGet Request形式で、ResponseはJSON形式のデータを返してきます。
この文章の意味分かりましたか、、?
さて、この前提条件を踏まえて全体の手順はこんな形です。
- URLを作成(Get Request用)
- 郵便番号検索APIにGET Requestを行う(郵便番号を送信)
- 郵便番号検索APIからResponseをもらう(住所情報を取得)
- 形式を変換する(JSONからKNIMEのテーブル形式に変換)
郵便番号検索APIの使い方
まず、使い方だけ郵便番号検索APIの使い方について簡単に押さえておきます。
郵便番号検索APIを使うには、下のようなURLを作る必要があります。
https://zipcloud.ibsnet.co.jp/api/search?zipcode=郵便番号7桁
例えば東京駅の郵便番号1000005を使用するとすると、
「https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000005」
となります。
これをWebブラウザに入力してみてください。JSON形式でレスポンスが返ってくると思います。
これを取得できればStep3までクリアです。簡単ですよね。
ちなみに住所のほかに、都道府県コードや郵便番号も返ってきてます。
Step1 - GET Request用 URLを作成
さて、まずはURLを作っていきましょう。
ここで使うのはString ManipulationのJoinという関数です。なんだそれ?という方は下記の記事をご覧ください。
今回は例なので、Table Creatorで住所を取得したい郵便番号の一覧を作っていきます。ExcelやCSVで作ってReaderで読み込んでも構いません。
次に、String ManipulationのJoin関数を使用して、文字結合させます。
これでURLが作成できました。
Step2,3 - 郵便番号検索APIを使う - GET Requestの使い方
さて、次に郵便番号検索APIに郵便番号を送信して、住所情報をもらいましょう。
KNIMEのGET Request Nodeで設定する部分は数項目で問題ないです。なので非常にシンプルかと思います。
ただしオプションがたくさんあるので、細かい使い方をしようとするとややこしいかもしれませんね。
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の内容
Status Codeの種類
ステータスコードは、3桁の数字で表され、番号によって意味が決まっています。下記引用です。
- 200番台は成功
- 200:OK、データを送ります
- 300番台はリダイレクト
- 301:新しい場所から取得してください(今後もずっと)
- 302:新しい場所から取得してください(今回だけ)
- 304:変更されていません(データ本体は送られない)
- 400番台はクライアント側のエラー
- 401:ユーザー認証が必要です
- 403:アクセスが禁止されています
- 404:見つかりませんでした
- 500番台はサーバー側のエラー
- 500:内部エラー
- 503:現在はサービス提供不可能
- 引用:
Configure - GET Request
さて、GET RequestのConfigureです。設定可能なOptionはたくさんありますが、今回は必要な部分についてのみ解説したいと思います。
1. URLの指定
まずはURLを指定します。URLの指定方法は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
Configure - String to JSON
まずはInput columnでコラムを指定します。また、新規でコラムを作成するか上書きするかも選択しましょう。
基本はこれで終了です。
その他のOptionは下記の通りです。
- Allow comments:JSONのなかに、コメントがあった場合に対処するオプションです。コメントは下記のように表されます。Comments /*...*/, and line comments // and #
- Fail on error:変換が失敗した場合にエラーとして止めるか、欠損値として扱うかです。チェックを入れるとエラーとして止まります。
Step4.2 - JSONからKNIMEのテーブルへ ~JSON to Table~
続いてもデータフォーマット変換です。こちらは非常に便利ですね。セル分割にやっていることは近いです。
Confirm - JSON to Table
Configure - JSON to Table
かなりオプション盛りだくさんなのですが、どれも任意項目なので設定なしでOKです。
解説がかなり長くなってしまったので、この部分は省略します。すみません。
気になる方はNode Pit見てみてください!
ちょっと一言
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が使用できます。
- Username:ユーザネームの入力
- Password:パスワードの入力
Request Headers - リクエストヘッダ
Connection Settingsで基本十分ですが、自分で細かく指定したい人はこちらを使うことができます。
- 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に関する日本語の本って今これくらいしかないと思うんですよね、、
本がいいなーと言う人はぜひ試してみてください。
参考リンク
- KNIME公式Node Pit(英語):
- KNIME Example Workflow(英語):
-
KNIME TV(英語):
Data Access with KNIME: Sending a GET Request to a REST service - YouTube
- すさんのブログ:
KNIMEで明日の天気を調べよう! 〜REST APIの活用〜 - 非プログラマーのためのインフォマティクス入門。(仮)
- その他:HTTP GETとPOSTの違い - ITを分かりやすく解説
- 郵便番号検索API - zipcloud
- HTTPステータスコード一覧とリクエストとレスポンスの意味を解説 | ITコラム|アイティーエム株式会社