【Laravel】LaravelでAPIを実装してみる

どーも!

たかぽんです!

今回はAPIをLaravelで実装してみようと思います!

正直右も左もわからない人にとってははてなまーくですよね。

そもそもAPIって?

laravelでどうやって実装するの?って言うのをざっくりとまとめていこうと思います!

APIとは・・・?

さて、API...

正直初めて聞く方はAPIってなんなの?って感じですよね。

もしもすでにAPIをご存知でしたら次節から。

あんまり知らないかなぁ・・・っと言う方は以下の記事を読んでみたあと、本記事を読んでみてください。

より理解しやすくなるはずです。

APIについて大まかに理解していただけたorしていた方は、早速laravelで作っていきましょう!

LaravelでAPIを作る主な方法

まず、APIを作成するには大まかに以下のことを行う必要があります。

  • API用のルート(エンドポイント)を作成
  • コントローラーにアクションを作成

割と普通のページを作成するのと似た感じですね。

ちなみに、APIを呼び出す際に実際に実行される処理関数をアクション(action)と呼びます。

では最小限で一つAPIを作ってみましょう!

APIのルート(エンドポイント)を作成する

普段ページを作成する時は"プロジェクト名/routes/web.php"にルートの定義を記載していました。

しかしながら、apiのルートは"プロジェクト名/routes/api.php"に記載をする必要があります。

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

// 以下を追加!
Route::get('test', 'TestAPIController@index');

もともと色々書かれていると思いますが、"以下を追加!"とコメントしている部分を追加します。

上記のように、Getリクエストで'test'とすることで、TestAPIControllerメソッドをapiとして呼び出すことができます。

追加したのは以下の一行です。

Route::get('api/test', 'TestAPIController@index');

この際、通常のweb.phpに定義した場合、"http://localhost:8000/api/test"というURLへアクセスすることでTestAPIControllerのindexメソッドを呼び出して、そのメソッドから.bladeファイルのビューを表示していました。

ただし、今回のように"api.php"にapiのルーティングとして書いた場合、"http://localhost:8000/api/test"というエンドポイントができて、そのエンドポイントを使用することでAPIを使用することができるわけです。

似ているようで実際の会話ではこのエンドポイント指定すれば〜とか、用語がちょっぴり違うので気をつけてください。

このエンドポイントというのは前述した別記事を読んだ方ならわかるかもしれませんが、APIが出てくる際よく出てきます。

簡単に言うとAPIへの入り口と覚えてもらえればOKです。

とにかく、これでAPIのエンドポイントは作成完了です!

コントローラーとアクションを作成

次は先ほどのエンドポイントでAPIが呼び出された際の処理自体を書いていきます。

コントローラーは"app/Http/Controllers/TestAPIController.php"として作成します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestAPIController extends Controller
{
   // indexアクションを定義(indexメソッドの定義と同義)
   public function index()
   {
		   return 'テストでーす';
   }
}

やっていることはテストでーすという文字列を返しているだけですね。

そんなに難しいことは行っていないので、簡単かなと思います!

実はこれでAPIの作成は完了です!

"テストでーす"という文字列を返してくれるAPIですねw

エンドポイントを確認してみよう!

さて、それでは一通りAPIを実装したので、一旦エンドポイントがちゃんとできているか確認しておきましょう!

以下のコマンドで確認することができます。

php artisan route:list

すると・・・以下のような出力が得られるはずです。

Takapon:MyProject taka$ php artisan route:list
+--------+----------------------------------------+------------+---------+------------------------------------------------+--------------+
| Domain | Method                                 | URI        | Name    | Action                                         | Middleware   |
+--------+----------------------------------------+------------+---------+------------------------------------------------+--------------+
|        | GET|HEAD                               | /          | welcome | Closure                                        | web          |
|        | GET|HEAD                               | api/test   |         | App\Http\Controllers\TestAPIController@index   | api          |
|        | GET|HEAD                               | api/user   |         | Closure                                        | api,auth:api |
|        | POST                                   | validation |         | App\Http\Controllers\techController@validation | web          |
|        | GET|HEAD                               | validation |         | App\Http\Controllers\techController@index      | web          |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | welcome    |         | Illuminate\Routing\RedirectController          | web          |
+--------+----------------------------------------+------------+---------+------------------------------------------------+--------------+

これは単純なルート定義と、apiのルート定義の一覧を確認しています。

今回追加したのはURIが"api/test"の行のものですね。

URI行は、ベースURI(今回はhttp://localhost:8000/)以降のURIが表示されます。

methodはちゃんとGETになっています。(HEADもありますが、今はスルーで大丈夫です!)

Actionというのが実際に行われる処理になります。

今回はApp\Http\Controllers\TestAPIController@indexなので、TestAPIControllerクラスのindexメソッドがアクションということになります。

また、Middlewareのところをみるとちゃんとapiになっていますね。

これらから・・・。

このAPIはGETリクエストができて、ベースのURIにAPIのURIを付与したhttp://localhost:8000/api/testがAPIのエンドポイントで、それによって呼び出される処理はTestAPIControllerのindexアクションだよ〜というのがわかりました。

では確認もできたので、実際に使ってみましょう!

クロージャでアクションを定義するとどうなる・・・?

ちなみにClosure(クロージャ)でアクションの定義を行うとどうなるんでしょうか・・・?

// apiルート定義時に直接アクションを定義するように(Closure)
Route::get('test', function () {
    return 'てすとでーす';
});

すると...?

Takapon:MyProject taka$ php artisan route:list
+--------+----------------------------------------+------------+---------+------------------------------------------------+--------------+
| Domain | Method                                 | URI        | Name    | Action                                         | Middleware   |
+--------+----------------------------------------+------------+---------+------------------------------------------------+--------------+
|        | GET|HEAD                               | /          | welcome | Closure                                        | web          |
|        | GET|HEAD                               | api/test   |         | Closure                                        | api          |
...
...

Action名がClosureになるんですね!

可読性や管理の面であまりクロージャとしての定義はおすすめしないんですが、一応Closureでも定義はできるんですね!

APIを使ってみよう!

では、実際にAPIを使ってみましょう!

今回定義したのはGETリクエストだったので、ブラウザでも大丈夫ですが、せっかくなのでcurlコマンドを使ってみましょう。

ちょっと難しいことは省きますが、curlコマンドを使ってAPIのエンドポイントからAPIを使うことができます。

では、以下のコマンドをターミナルで実行してみましょう!

curl 'http://localhost:8000/api/test'

すると・・・?

Takapon:MyProject taka$ curl 'http://localhost:8000/api/test'
テストでーす

お、テストでーすという文字列が返ってきました!

とりあえず最低限のAPIの構成は以上です!

ただ、先ほどお伝えしましたが、一般的にAPIではJSON形式で値を返します。

今回は最小限の構成にするため簡略化して文字列を返しています。

本来なら、大抵DBのを伴う処理が入ります。

例えば本ブログの記事ならば、閲覧API(DBから取得)、記事投稿API(DBに追加)、記事削除API(DBから削除)といった具合です。

その際に、DBと関係のあるモデルを楽にJSON形式として変換するAPIリソースと言う機能がLaravelにはついていたりもします。

ここらへんもしっかりまとめたいけど・・・

そのお話は...また今度...。

まとめ

LaravelでAPIを実装する最小限の方法をみてみました。

正直APIを設計する際はもっといろんなことに気をつける必要があります。

今回は検証用だったのでtestと名付けたエンドポイントでですが、実際は処理に合わせたエンドポイント名にする必要がありますし、今回は文字列を返したAPIの返り値ですが、本来なら使う側でこう言う形のJSONでこう言うパラメータが返ってくると嬉しいよね。

などなど...より実際の運用を考慮した設計をする必要があるわけですね。

また、そこらへんも記事をかけたらいいですねぇ・・・(やる気でれば・・・w)。

それでわ!

おすすめの記事