0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelでCRUDのAPIを実装する方法(Postmanで動作確認)

Posted at

環境

  • Laravel 10.4.1
  • PHP 8.2.4

前提

動くLaravelアプリは完成されていて、DBとモデルは既に存在することを前提とする。
APIの動作はPostmanで確認する。

目的

既に動作しているLarvelのtodo管理のアプリに、

  • GET
  • POST
  • PUT
  • DELETE
    のAPIでのエンドポイントを作って、postmanで動作確認する。

作業

API用コントローラーを作成

php artisan make:controllerコマンドでコントローラーを作成。
今回はApiTodoControllerという名前にする。

bash
$ php artisan make:controller ApiTodoController.php
Controller created successfully.

作成できたら、通常の\Controllers直下にApiフォルダを作り、
\Controllers\Api
に配置する。(わかりやすいようにApiフォルダに分けた)
→\Laravelapp\app\Http\Controllers\Api\ApiTodoController.php
となる。

API用コントローラーを修正

ApiTodoController.php を下記のように修正していく。

ApiTodoController.php
<?php
namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Todo;
use App\Http\Controllers\Controller;

class ApiTodoController extends Controller
{

    /**
     * todo作成.
     *
     * @param Request $request
     * @return void
     */
    public function create(Request $request) {

        if(!$request->user_id){
            return response()->json('ユーザーIDが未入力です' , 400);
        }
        if(!$request->title){
            return response()->json('タイトルが未入力です' , 400);
        }
        if(!$request->todo){
            return response()->json('TODOが未入力です' , 400);
        }
        $user = User::find($request->id);
        if(!$user){
            return response()->json('追加対象のユーザーが存在しません' , 400);
        }

        $todo = Todo::create([
            'user_id' => $request->user_id,
            'title' => $request->title,
            'todo' => $request->todo,
            'add_date' => NOW(),
        ]);
        return response()->json($todo);
    }
    /**
     * todo取得.
     *
     * @param Request $request
     * @return void
     */
    public function fetch(Request $request) {
        $todo = Todo::find($request->id);
        if(!$todo){
            return response()->json('取得対象のTODOが存在しません' , 400);
        }
        return response()->json($todo);
    }
    /**
     * todo更新.
     *
     * @param Request $request
     * @return void
     */
    public function update(Request $request) {
        if(!$request->title){
            return response()->json('タイトルが未入力です' , 400);
        }
        if(!$request->todo){
            return response()->json('TODOが未入力です' , 400);
        }

        $todo = Todo::find($request->id);
        if(!$todo){
            return response()->json('更新対象のTODOが存在しません' , 400);
        }
        $todo->update([
            'title' => $request->title,
            'todo' => $request->todo,
            'update_date' => NOW(),
        ]);

        return response()->json($todo);
    }
    /**
     * todo削除.
     *
     * @param Request $request
     * @return void
     */
    public function delete(Request $request) {
        $todo = Todo::find($request->id);
        if(!$todo){
            return response()->json('削除対象のTODOが存在しません' , 400);
        }
        $todo->delete();
        return response()->json();
    }

}

今回、

  • GET
  • POST
  • PUT
  • DELETE
    のエンドポイントを作るので、それに合わせて、
  • POST - createメソッド
  • GET - fetchメソッド
  • PUT - updateメソッド
  • DELETE - deleteメソッド
    を作成した。

createメソッド

ApiTodoController.php
$todo = Todo::create([
    'user_id' => $request->user_id,
    'title' => $request->title,
    'todo' => $request->todo,
    'add_date' => NOW(),
]);
return response()->json($todo);

createメソッドでは、送られてきたリクエストをtodoテーブルに保存する。
その前にバリデーションをかけて、エラーならエラーを返す処理になる。
保存した状態になったモデルが$todo変数に返って、それを
return response()->json($todo);
の形式で書くことで、リクエスト元にJASON形式でレスポンスを返す。

fetchメソッド

ApiTodoController.php
    $todo = Todo::find($request->id);
    if(!$todo){
        return response()->json('取得対象のTODOが存在しません' , 400);
    }
    return response()->json($todo);

送られてきたIDによりtodoテーブルの内容を取得、リクエスト元に対して、取得できた内容をJSON形式で返す。

updateメソッド

ApiTodoController.php
    $todo = Todo::find($request->id);
    if(!$todo){
        return response()->json('更新対象のTODOが存在しません' , 400);
    }
    $todo->update([
        'title' => $request->title,
        'todo' => $request->todo,
        'update_date' => NOW(),
    ]);
    
    return response()->json($todo);

findメソッドでtodoクラスを取得した後に、updateメソッドを使用。
同様に、リクエスト元に対して、更新した内容をJSON形式で返す。

deleteメソッド

ApiTodoController.php
    $todo = Todo::find($request->id);
    if(!$todo){
        return response()->json('削除対象のTODOが存在しません' , 400);
    }
    $todo->delete();
    return response()->json();

deleteメソッドも同様にfindメソッドでtodoモデルを取得後、deleteメソッドを呼ぶことで削除する。リクエスト元に対しては、レスポンスとしては何も返していない(エラーの時には返る)。

APIのルーティングを設定する

通常のルーティングはroutes/web.phpに記載していたが、APIとしてアクセスする場合のルーティングはroutes/api.phpに記載する。

api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\ApiTodoController;

// todoのCRUD(API呼び出し)
Route::post('todo', [ApiTodoController::class, 'create']);
Route::get('todo', [ApiTodoController::class, 'fetch']);
Route::put('todo', [ApiTodoController::class, 'update']);
Route::delete('todo', [ApiTodoController::class, 'delete']);

1行目の場合だと、
→APIから、http://*******/api/todoPOST形式でアクセスすると、ApiTodoControllercreateメソッドが呼び出される、
ということになる。
(routes/api.phpで作成したルーティングにはURLでデフォルトで/apiがつくため、todoのルーティングでは、/api/todoと呼び出すことになる。)

以下同様に、

  • /api/todo にgetでアクセスすると、fetchメソッドが呼ばれる。
  • /api/todo にputでアクセスすると、updateメソッドが呼ばれる。
  • /api/todo にdeleteでアクセスすると、deleteメソッドが呼ばれる。
    となる。

実際にAPIから呼んでみる

Postmanというツールを使用する。
APIのテストをおこなうためのツールで、手早くHTTPリクエストを送信してエンドポイントが正しく機能しているか確認することができる。
参考:RESTサービスを触る際の必須ツールPostmanを使ってみました

今回は、Laravel環境にhttp://localhost:8000でアクセスできるので、API呼び出しにはhttp://localhost:8000/api/todoを使う。

createメソッド

まずは、最初のcreateメソッドの呼び出しを行ってみる(データの追加)。
ルーティングに設定した通り、postで呼び出す。
(画面中央右寄りの「JASON」となっている部分は、「JASON」を選ばないと正しく動作しない。)
結果としてpostmanの画面では、下記のように返ってくる。
上部がAPIからの呼び出し値、下部がレスポンス値。
230503_000000.JPG

呼び出し値
{
    "user_id":9,
    "title":"APIからのテスト",
    "todo":"230503"
}
返り値
{
    "user_id": 9,
    "title": "APIからのテスト",
    "todo": "230503",
    "add_date": "2023-05-03T05:59:36.869734Z",
    "id": 106
}

テーブルをphpmyadminから確認しても、データが追加されていることが確認できた。
230503_000001.JPG

ちなみに、user_idを100、という存在しないIDで呼び出すと、下記のようにエラーが返るように、簡単なバリデーションを設定した(他のメソッドも同様)。
230503_000007.JPG

呼び出し値
{
    "user_id":100,
    "title":"APIからのテスト",
    "todo":"230503"
}
返り値
"追加対象のユーザーが存在しません"

fetchメソッド

GETで呼び出して、IDは98とする。
230503_000002.JPG
このように、取得したデータが返ってきました。

呼び出し値
{
    "id":98
}
返り値
{
    "id": 98,
    "user_id": 9,
    "title": "22222222",
    "todo": "22222222",
    "add_date": "2023-04-22 16:40:01",
    "update_date": "2023-04-22 16:40:01"
}

updateメソッド

PUTで呼び出して、IDは98とする。
このように、更新したデータが返ってきました。
230503_000003.JPG

呼び出し値
{
    "id": 101,
    "title": "APIからのテスト update",
    "todo": "23050 update"
}
返り値
{
    "id": 101,
    "user_id": 9,
    "title": "APIからのテスト update",
    "todo": "23050 update",
    "add_date": "2023-05-02 15:09:22",
    "update_date": "2023-05-03T06:12:24.605165Z"
}

テーブルを確認して、データが更新されていることが確認できた。
230503_000004.JPG

deleteメソッド

DELETEで呼び出して、IDは103とする。
deleteなのでデータは返ってきません。
230503_000005.JPG

呼び出し値
{
    "id": 103
}
返り値
[]

テーブルを確認して、ID=103のデータが削除されていることが確認できた。
230503_000006.JPG

まとめ

今回は、CRUD処理(参照、追加、削除、更新)をエンドポイントとしたAPIの実装を行ってみましたが、意外に簡単にできた。
バリデーションは簡易なものだけにしていますが、実際には認証処理なども含めて考える必要があると思う。

参考

RESTサービスを触る際の必須ツールPostmanを使ってみました
LaravelでAPIを作成する方法!
【Laravel】APIを実装するやり方を解説します

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?