Laravelを使って、APIを作成する方法を書いています。
今回作成するAPIはテーブルに対して、追加・取得・更新・削除(CRUD)を行います。
簡単なAPIの説明の後にコントローラーを作成して、ルートを追加した後に、Postmanからリクエストしてみます。
データベースにはsqliteを使っていて、載せているサンプルコードはLaravelのバージョン8で書いています。
WebのAPIとは?
APIは「Application Programming Interface」の略です。
Wikipediaには下記のように記載があります。
広義ではソフトウェアコンポーネント同士が互いに情報をやりとりするのに使用するインタフェースの仕様である。
APIだけで言うと、ソフトウェア部品同士が情報をやり取りするものみたいな感じです。
Web上でAPIといわれるものは、URLに対してリクエストすると、サーバー上で処理を行なって結果を返してくれるものになります。
FacebookやTwitter,Googleなど有名なサービスがAPIを公開していて、サービスに対しての操作をAPIを使用して行えるようになっています。
例えば、郵便番号検索APIというものが、こちらに公開されています。
郵便番号を渡すと、レスポンスがJSON形式で返ってきます。
`https://zipcloud.ibsnet.co.jp/api/search?zipcode=8100001`にアクセスすると、下記のように結果を返してくれます。
{
"message": null,
"results": [
{
"address1": "福岡県",
"address2": "福岡市中央区",
"address3": "天神",
"kana1": "フクオカケン",
"kana2": "フクオカシチュウオウク",
"kana3": "テンジン",
"prefcode": "40",
"zipcode": "8100001"
}
],
"status": 200
}
zipcodeパラメータに渡す内容を変えると、郵便番号に合わせた住所を取得できます。
このようにWebのAPIはURLに対してリクエストして、何らかのレスポンスを返したり処理を行なってくれるものです。
テーブルを作成する
モデルとテーブルの作成までを行なってください。
コントローラーを作成する
モデルとテーブルの用意ができたら、APIとしてリクエスト受けて処理をしてくれるコントローラーを作成します。
下記のartisan
コマンドでコントローラーが作成できます。
$ php artisan make:controller MemberController
Controller created successfully.
コントローラーを作成したら、下記のようにAPIフォルダ配下に配置します。
そのままでも良いのですが、わかりやすいようにAPIディレクトリ配下にしました。
作成したapp/Http/Controllers/Api
配下のMemberController.php
ファイルを下記のように編集します。
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Member;
use App\Http\Controllers\Controller;
class MemberController extends Controller
{
/**
* メンバー作成.
*
* @param Request $request
* @return void
*/
public function create(Request $request) {
$member = Member::create([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
return response()->json($member);
}
/**
* メンバー取得.
*
* @param Request $request
* @return void
*/
public function fetch(Request $request) {
$member = Member::find($request->member_id);
return response()->json($member);
}
/**
* メンバー更新.
*
* @param Request $request
* @return void
*/
public function update(Request $request) {
$member = Member::find($request->member_id);
$member->update([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
return response()->json($member);
}
/**
* メンバー削除.
*
* @param Request $request
* @return void
*/
public function delete(Request $request) {
$member = Member::find($request->member_id);
$member->delete();
return response()->json();
}
}
解説
MemberControllerを作成して、メソッドを4つ作成しました。
create
・fetch
・update
・delete
です。
createメソッド
create
メソッドでは送られてきたリクエストをmembers
テーブルに保存します。
Member
モデルのcreate
メソッドを使用することにより、保存できます。
$member = Member::create([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
このように連想配列を渡すことによって保存しています。
受け取ったリクエストのそれぞれデータをテーブルカラムにそのまま入れて保存しているイメージです。
保存した後の状態になったモデルが$member
変数に返ってきます。
下記のように書くことで、リクエスト元に対して、JSON形式でレスポンスを返します。
return response()->json($member);
レスポンスで返すのは、作成した$member
変数の値です。
fetchメソッド
fetch
メソッドでは、Member
クラスのfind
メソッドを使用して、送られてきたmembers
テーブルのidからMember
モデルを取得しています。
リクエスト元に対して、取得できた内容をJSON形式で返しています。
$member = Member::find($request->member_id);
return response()->json($member);
updateメソッド
update
メソッドでは、fetch
メソッドの時と同様にfind
メソッドでMember
モデルを取得した後にupdate
メソッドを使用しています。
$member = Member::find($request->member_id);
$member->update([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
create
メソッドと同様に連想配列でカラムと値を定義することにより更新ができます。
左側のキーがカラム名で、右側の値がカラムに入れる値になります。
update
メソッドも、リクエスト元に対して、更新した内容をJSON形式で返しています。
deleteメソッド
delete
メソッドでも、まずfind
メソッドでmember_id
のMember
モデルを取得しています。
その後にdelete
メソッドを呼ぶことで、対象のテーブルのデータが削除されます。
$member = Member::find($request->member_id);
$member->delete();
return response()->json();
Member
モデルには論理削除の設定を行なっているので、deleted_at
に削除日付が入ります。
リクエスト元に対しては、レスポンスとしては何も返していません。
Eloquentについては、下記にも記載しているので気になる方は確認してみてください。
APIのルートを作成する
ブラウザからアクセスして使用する場合のルーティングはroutes/web.php
に記載しました。
APIとしてアクセスする場合のルーティングはroutes/api.php
に記載します。
今回は、下記のようにルートを作成しました。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\MemberController;
// memberのCRUD
Route::post('member', [MemberController::class, 'create']);
Route::get('member', [MemberController::class, 'fetch']);
Route::put('member', [MemberController::class, 'update']);
Route::delete('member', [MemberController::class, 'delete']);
最初に追加するためのルーティングを書いています。
Route::post('member', [MemberController::class, 'create']);
Route
クラスのpost
メソッドなので、POST
形式のHTTPリクエストを受け付けます。
第1引数の/member
にアクセスすると、第2引数に指定した配列のMemberController
のcreate
メソッドで処理をします。
routes/api.php
で作成したルーティングにはURLでデフォルトで/api
がつきます。
実際のURLはLaravelがローカルで動く場合だと
「http://localhost/api/member
にPOST形式でアクセスすると、MemberController
のcreate
メソッドが動く」ということになります。
それぞれ同様にして、下記のように3つのルートを作成しています。
・`/api/member`に`PUT`形式でアクセスすると、`update`メソッドが動く
・`/api/member`に`DELETE`形式でアクセスすると、`delete`メソッドが動く
動作確認する
それではPostmanから動作確認してみます。
今回はLaravelの環境に `http://127.0.0.1:8000` でアクセスできるようにしました。
最初にデータを追加してみます。
/api/member
に下記のようにアクセスします。
リクエストがJSON形式でmembers
テーブルに入れたい値を書いています。
結果として、下記のように返ってきます。
作成されたデータにid
が振られていることが確認できます。
テーブルを見ると、このようにデータが入っていることが確認できました。
次にmembers
テーブルのデータを取得してみます。
同じURLにGET
形式でアクセスします。作成したデータはid
が1
なので、member_id
が1
でリクエストしています。
このように、作成したデータが返ってきました。
次に更新してみます。同じURLにPUT
形式でアクセスします。
POST
の時と同じようなリクエストですが、更新のためmember_id
を含めています。
テーブルを確認すると、更新されています。
同じURLにDELETE
形式でアクセスします。
テーブルを確認すると、削除されています。
(論理削除なので、deleted_at
のカラムが更新されています)
終わりに
今回はLaravelを使用して、データベースのテーブルに対して、追加・取得・更新・削除の4つの操作を行いました。
URLは同じにしましたが、HTTPでアクセスするときの形式で処理を切り替えました。
今回は最低限の設定だけ行なって、簡単なAPIを作成しました。
実際に作るときには、バリデーションやデータが取れなかった時なども想定して作成する必要があるかと思います。
コメント