Laravel開発、Jsonデータ処理を理解してAPIを扱う【1】新規アプリ作成し、挙動を確認する
WebAPIを利用してアプリ制作の幅を広げていろいろやってみたいので、APIを扱ってみることにしました。
まず、そもそもWebAPIを扱うにあたってJSON形式のデータを扱うことが多いようなので、JSON形式のデータをPHPで扱う方法を学ぶことから始めることにしました。
今回は、作成中アプリではなく、動作確認用に新たなアプリを作成していろいろとやってみました。
今回の目的
なぜやるか
WebAPIの扱い方を学び、実装まで行うことで、他のWebAPI等も扱える様になるための知識をつける
やりたいこと
JSONデータを受け取り、必要なデータをDBに保存する
やったこと
テスト用アプリでJSONデータを実際に扱う
書籍を扱うWebAPIを知る
WebAPIを利用してJSONデータを受け取る
JSONデータから必要な情報をDBに保存する
実施内容
JSONデータを処理してみる
データがどう出力され、どう処理すればいいか?から調べてみることにしました。
まず、扱い方について以下のサイトを参考にさせて頂きました、ありがとうございます。
コードを書いて出力するその1
上記サイトを参考にまず、コードを書いてみてブラウザに出力してみました。
まず初めに書いた3パターンのコードの結果から。
# 出力結果1
まず、1.PHPで変数に配列を格納。そして、2.JSON形式に変換して出力、最後に3.JSON形式をもう一度PHPの配列に変更しています。
コードの内容は以下のとおり。
1.PHPの配列を格納
# ~/resource/views/test.blade.php
$arrayに配列を作ってそのまま表示させています。
初めは、echo $arrayでエラーとなり画面出力できませんでした。
こちらは、print_rを使うことで配列の詳細が出力されるという所から勉強になりました。
サイトを動作する上ではprint_rで出力することはないとは思いますが、データの確認には必須ですね。
# ~/resource/views/test.blade.php
配列を代入した変数はあくまで配列のままです。
ここでjson_encodeすることでJSON形式の変換されるようです。
こちらについては、echoで$json変数を設定することで出力することができました。
エンコードにはオプション指定によって、出力時のテキスト表示を変更することができます。
# ~/resource/views/test.blade.php
次は、JSONに変換していた情報をPHP配列に変換する処理です。
こちらはjson_decodeとすることで変換できます。
配列型に変換するには第二引数を"true"指定します。"false"だとオブジェクト型となるそうです。
コードを書いて出力するその2
次に、JSONデータを基点としてデータの扱いを確認してみました。
先程同様、3パターンのコードの結果から。
# 出力結果2
4.JSONデータ保存で変数にJSONデータを格納して出力、そこから5.デコード処理で配列に変換、6.デコード処理を変えてオブジェクトに変換を実施しました。
コードの内容は以下のとおり。
4.JSONデータを変数として組み込む。
# ~/resource/views/test.blade.php
JSON形式とPHP配列は異なる
先程のコード2では、JSON形式はechoで出力できるとありましたが、
JSONデータを変数に代入するにあたって、初めはこちらで書いていました。
# ~/resource/views/test.blade.php
何が違うかというと、$json2に代入する値がテキスト扱いになっていません。
JSON形式を扱うにはJSONデータのデコードをすることによってPHPで扱える配列にします。
しかし、この修正前のコードはエンコードした配列ではなく、PHPで扱える情報になっていなかったんですね。
この記事の作業をする前にもAPI関連を扱おうとしていたのですが、ここがよく分かっていないままAPIを扱おうとして、なかなかうまく動作していなかったようです。
私の理解になりますが、JSONデータはあくまでPHPのデータでなくJSON形式の表現であり、PHPで扱うにはプロトコル変換が必要なわけです。
変換前のテキストを変数として扱おうとしていたので、JSONテキストとして扱うために全てをテキスト化する必要がありました。
前もって準備したJSON形式データを読み込む…といった場合はJSON形式で書いたファイルを読み込むという形が多そうですが、今回のこの記述によって扱い方がよく分かりました。
ここまでで、そもそものJSON形式の扱い方について確認しました。
これから、実際にWebAPIを利用してデータのやりとりを出来るようにしていきます。
WebAPIを扱う
現在作成しているアプリは本の情報を登録という物です。
現状は、新規にユーザーが書き込むことで登録出来るようにしています。
しかし、WebAPIには以下のような便利な物があり、参考にさせて頂きました、ありがとうございます。
ISBNという本に振られているコードを元に検索することで、本の情報があれば、詳細なデータが受け取れるというものです。
これを扱えるようになれば、ISBNコードさえあれば、ユーザーがタイトルや詳細情報、写真をわざわざ入力しなくても簡単に登録できます。
はじめからこれを使って入ればそもそも登録ページは不要…なんてことになりそうですが、情報がない本を登録するにはやはり手動による登録手段も必要でしょう。
※なにより最初からISBNオンリーだと手動登録のコードの学習にはならないですから…。
上記のサイトを元に今回は"openDB"を利用してJSON形式を扱い、データを取得できるようにしてきます。
openDBを扱う
まずはデータを表示させてみる
openDB公式サイトはこちらです。
まずは、実際にデータを取得できるかを試します。
扱いかたはシンプルで下記のURLにアクセスするだけです。
https://api.openbd.jp/v1/get?isbn="ISBN番号"
ブラウザに実際に入力して確認します。
やたらと長いデータですが、情報としてはとれています。
後はこのデータを処理する流れとして、
- 専用フォームからISBNコードを入力
- 上記のアドレスに加工して送信
- 受け取ったデータから必要な情報を取り出す
- データを保存する
という流れがコードとして書ければ動いてくれそうです。
コード上でWebAPIにアクセスし結果を受け取る
毎回ブラウザで直接URLを入れてデータを受け取るわけにも行かないので、
コードの処理上でWebAPIのデータを取得してみることにしました。
処理方法については、こちらを参考にさせて頂きました、ありがとうございます。
こちらを元に、データが受け取れるかを試してみます。
# テストコード
<?php
$base_url = 'https://api.openbd.jp/v1/get?isbn=';
$tag = '9784801907607';
$response = file_get_contents(
$base_url.$tag
);
$result = json_decode($response,true);
print_r($result);
これらのコードを書いてこのページをリロードすると、対象データを取得することができました。
しかし、このままでは毎回同じISBNコードの情報となります。
任意のISBNコードを指定してデータを取得する
ここからは、ユーザーが入力したISBNコードからWebAPIを利用して情報検索し、必要なデータが取得できるようにしていきます。
上記のサイトに加え、こちらも参考にさせて頂きました、ありがとうございます。
まず、入力フォームを作成します。
# ~/resource/view/test/index.blade.php
コントローラ側ではopenDB向けにデータを送信し、結果を受け取る処理をいれました。
# ~/app/Http/Controllers/test.blade.php
ベースとなるURLにフォームから入力したISBNコードを結合してfile_get_contentsを利用し情報を取得しています。
これでフォームからISBNコードを入力し送信することで、結果がブラウザに出力されることを確認しました。
直接URLをブラウザに入力したときと同様に結果が返ってきました。
後は、ここから必要なデータを保存できれば実用化できそうです。
DBに結果を保存する
テーブルに1カラムのみを追加して試す
WebAPI情報を保存する為に、まずはカラムを追加します。
一気に追加して保存…といいたいところですが、まとめてやっても失敗することが多いので、まずはISBNコードのみを保存することから始めました。
とはいえ、フォームから入力したISBNコードをそのまま保存していては意味がないので、WebAPIから取得したJSONの中からISBNコードを取り出して保存します。
マイグレーションファイルに必要なカラムを追加します。
# ~/database/migrations/migratefile.php
最終的にはコメントアウトしているカラムについても追加の予定です。まずはISBNのみ追加して、動作を確認します。
次に、取得したJSONからISBNコードを取得する処理を書きます。
今回のJSONデータには様々な情報がありますが、JSON内にある"summary"情報のみにしぼりこんで、この中の情報を扱うこととしました。
# ~/app/Http/Controllers/test.blade.php
$responseに取得したJSONコードを代入。
そして、デコードしてPHPで扱えるように変換。
そこから今回保存するISBNコードのみを取り出し、ISBNカラムに保存しています。
これで、フォームからISBNコードを入力して送信。
DBにISBNコードが反映されました。
DBに必要カラムを全て追加する
これであとは、"summary"に含まれている、他の情報をDBに保存できるようにしていきます。
まずは、DBにカラムを追加。
# ~/database/migrations/migratefile.php
データの取り出しについても、複数のコードを扱えるように修正します。
# ~/app/Http/Controllers/test.blade.php
そして、実際にISBNコードをフォームから入力してDBを確認します。
情報が追加できていることを確認しました。
以上で、WebAPIを利用してデータを取得し、その内容を保存するまでの工程が扱えるようになりました。
後は、仮のアプリで試していたので、実際に作成しているアプリにこの処理をいれることで、ISBNコード利用によるデータ登録ができるようにしていきます。
さらに、下記の事についても追加で作成する必要があります。
実際にアプリを作成する段階でこちらにも取り組みたいと考えています。
- 登録完了時に内容を表示させる。
- ISBNコード13桁を利用して検索するので、桁数誤りや数字でない場合の処理
- 検索結果がなかった場合の処理
長くなってきたので、作成中アプリへの実装は記事を分けます。