Laravel + Guzzle でWebAPIを呼び出し結果をDBに保存する方法
目次
スポンサードリンク
今回は無料で公開されているWebAPIにアクセスして、取得してきたJSONデータをデータベースに保存する一連の流れをLaravelのHTTPクライアントGuzzleを使って実装していきます。
Guzzleとは
- PHP用のHTTPクライアントライブラリ
- MITライセンス
- 作者は Michael Dowling
- Composerでのインストールが本家推奨。
- Laravelには同梱されている。
- 公式ドキュメント https://docs.guzzlephp.org/en/stable/index.html
やりたいこと
一般公開されているWebAPIの中から今回はNHKの番組表APIにアクセスして取得した番組情報をデータベースに保存します。手元で試したい場合はサイトからユーザー登録してアプリケーション用のキーを取得しておきます。
NHK番組表API
https://api-portal.nhk.or.jp/
アプリケーションを作成する
Windows上に構築したLaravel開発環境で試していきます。 開発環境の構築がまだの場合はこちらの記事を参考にしてください。
まずは、テスト用にアプリケーションを作成します。 コマンドプロンプトを起動して以下のコマンドを実行します。apitest の部分は任意のプロジェクト名を指定して下さい
D:\apps>composer create-project laravel/laravel apitest
composer が Laravel の動作に必要なパッケージ群をダウンロードしプロジェクトの雛形が出来上がります。私の環境では 62種類の パッケージがインストールされました。
今回WebAPI との通信で使用するパッケージ Guzzle も、現在はLaravel標準に組込まれているので一緒にダウンロードされています。
番組テーブル、モデルを用意する
まずは、データベースのモデルを作成しましょう。 番組情報を管理するモデル「Program」を用意します。 コマンドプロンプトで以下のコマンドを実行します。
php artisan make:model Program -m
モデルを実装するファイルをマイグレーション用のファイルが生成されたので、テーブルの情報を書いていきます。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('programs', function (Blueprint $table) {
$table->id();
$table->string('title')->comment('タイトル');
$table->string('subtitle')->comment('サブタイトル');
$table->dateTime('start_time')->comment('開始日時');
$table->dateTime('end_time')->comment('終了日時');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('programs');
}
};
今回は番組のタイトル、サブタイトル、開始終了それぞれの日時を保存します。データを作成した日時を管理するcreated_atなどもよくテーブル定義にありますが、作成日時(created_at)と更新日時(updated_at)はデフォルトで追加されるので記載は不要です。ここら辺もマイグレーションは便利ですよね。
コマンドプロンプトでマイグレーションを実行します。
php artisan migrate:fresh
データベースを見てみます。programsテーブルが出来上がってますね。
APIの呼び出し処理を実装する
コマンドプロンプトで以下を実行してコマンドの実行ファイルを作りましょう。
php artisan make:command GetProgramsCommand
出来上がったファイルを以下の様に編集します。WebAPIからデータを取得し、取得したデータをJSON形式に変換、モデルにセットしてデータベースに保存しています。
<?php
namespace App\Console\Commands;
use DateTime;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Models\Program;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7;
use GuzzleHttp\Exception\ClientException;
class GetProgramsCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:get-programs-command';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$method = "GET";
// 2023年10月20日の東京エリアの番組情報を取得するURL
$key = "_ENTER_YOUR_KEY_"; // APIキーは仮の値
$url = "https://api.nhk.or.jp/v2/pg/list/130/g1/2023-10-20.json?key=" . $key;
try {
$client = new Client();
$response = $client->request($method, $url);
} catch (ClientException $e) {
echo Psr7\Message::toString($e->getRequest());
echo Psr7\Message::toString($e->getResponse());
}
$data = $response->getBody();
$data = json_decode($data, true);
foreach ($data['list']['g1'] as $programElement) {
$program = new Program();
$program->title = $programElement['title'];
$program->subtitle = $programElement['subtitle'];
$program->start_time = DateTime::createFromFormat(DateTime::ATOM,$programElement['start_time']); // ISO 8601 形式は失敗する
$program->end_time = DateTime::createFromFormat(DateTime::ATOM,$programElement['end_time']);
$program->save();
}
}
}
コマンドプロンプトでコマンドを実行しましょう。
php artisan app:get-programs-command
phpMyAdminでテーブルを見てみましょう。番組データが保存できていますね。
PHP、Laravelを学ぶ際のおすすめ書籍
プロフェッショナルWebプログラミング Laravel
Docker Desktop + Laravel Sail を使った環境構築に始まり、Twitter風アプリを題材に基本的なアプリケーション構築の流れを学べます。メール送信やログイン、バッチ処理など実践的な内容もかかれてたので最初の一歩にはおすすめです。
レベルアップPHP ~言語を理解して中級者へ~
PHPの入門書を読み終えさらなる実力をつけたいエンジニア向けの技術書です。PHPの入門書にはあまり載っていないバージョンアップ方法やパフォーマンスなど、実務に役立つ内容も記載が豊富。30日間の無料体験もできる『Kindle Unlimited』でも読めます。
独習PHP 第4版
PHP の基本から抑えたいときはこちら。解説が詳しい、練習問題で知識の定着も促せる。辞書のような一冊。手元にある安心感。とにかく分厚い。
Twitterもやってます。
Web開発やノーコード開発、趣味のお酒や家庭菜園についてつぶやいてます。
https://twitter.com/haradedede
Search
Recent Posts
- OpenSSHのエラー「bad ownership or modes for chroot directory component」の原因と解消方法
- Apacheの起動状態をチェックして停止してる場合にApacheを起動するシェルスクリプト
- Amazon LinuxのOSバージョンを調べる方法|/etc/redhat-release の代替ファイル
- MYSQLでダンプファイルを取得する際に発生したエラー「Couldn't execute 'SELECT BINLOG_GTID_POS('', '0')': You are not using binary logging (1381)」の原因と対処方法
- RHEL系Linuxでリポジトリを一覧表示するコマンド(dnf repolist)