プレゼンテーション層のコントローラとフォームバリデーションを実装していきます。 コントローラの役割はリクエストされたパラメータの検証と、アプリケーション層のユースケースへの受け渡し、レスポンスの生成と…
REST APIのバックエンドを実行するためにPostmanをセットアップします。
PostmanとはHTTPリクエストを自由に定義して送信できるアプリケーションで、APIの開発に活用するとグンと効率がアップします。
連載
本記事は複数記事の連載記事の1つです。
この記事に関連するコミット
Postmanをインストールする
公式ダウンロードページ
https://www.postman.com/downloads/
Macの場合
パッケージマネージャーのHomebrewを使っている場合、ターミナルから以下のコマンドでインストール可能です。
brew install postman
Postmanを実行する
Postmanを起動するとアカウント認証を求められます。
アカウントを作成するとWorkspaces機能(チームでAPIを共同開発)を使用できます。
不要な場合は下に表示されているSkip and go to the app
を押せばアカウントを作らなくても使用できます。
Order findリクエストを作成する
その前にLaravelを実行するために開発サーバーを起動します。
php artisan serve
注文IDを指定して1件の注文を取得するOrder findエンドポイントを実行するリクエストを作成します。
「Collections」の「New」をクリックし、HTTP Request
を選択すると右側のペインに作成タブが追加されます。
api.phpに定義しているルーティングを見ながら、リクエストを作成していきます。
- リクエストメソッドは「GET」なのでGETをセット
- URLに「http://127.0.0.1:8000/api/orders/1」をセット
- 「Send」を押して実行
(本編と関係は薄いですが)実行すると、上手く動かないので解消していきます。
実行するとLaravelのトップページが表示される
web.phpのルートに定義されたwelcomeページへ飛ばされてしまいます。
これはPostmanのヘッダーにXHRリクエストであることを示す以下の値が無いため、追加します。
公式のドキュメント XHRリクエストとバリデーション
Key: X-Requested-With
Value: XMLHttpRequest
実行してJSONで結果が返却されればOKです。
orderIdを指定しているのに認識されない
FormRequestはGETパラメータの値はそのままでは対象にならず、必須チェックをしていると絶対に通りません。
"orderId": [
"The order id field is required."
]
fix Include get request parameters in validation のコミットの通り、「validationData」メソッドでバリデーション対象に追加します。
public function validationData(): array { return [ 'orderId' => $this->orderId, ]; }
nullエラーが発生する
Attempt to read property \"id\" on null
$orderは取得できずnullの場合があります。
その際に$order->id
が参照できずにエラーとなっていました。
IDEでエラーとして検出して欲しいところですがPHPなので期待は禁物です。
もしかするとPHPStormのようなゴリゴリなIDEなら検出してくれるかもしれません。
今回は?
を付けてnullの場合はnullを返すようにしておきます。
$order = $useCase->find($data['orderId']); return response()->json([ 'id' => $order?->id, 'orderNumber' => $order?->orderNumber, 'orderDatetime' => $order?->orderDatetime, ]);
Order createリクエストを作成する
findと同様の手順でcreateリクエストを定義していきます。
HTTPメソッドを「POST」に変更し、URLは「http://127.0.0.1:8000/api/orders」を入力します。
JSONのペイロードを以下の手順でセットします。
「Body」→「raw」→「JSON」→JSONフォーマット形式で入力
「Send」をクリックしてレスポンスに作成されたOrderのIDが返ってくればOKです。
そのIDをfindリクエストで指定すれば取得も可能です。
コメントを書く