Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
第7回 社内勉強会 「REST APIを作ってみよう」
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Wemotion, Inc
December 24, 2022
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第7回 社内勉強会 「REST APIを作ってみよう」
Wemotion, Inc
December 24, 2022
More Decks by Wemotion, Inc
See All by Wemotion, Inc
第10回 社内勉強会「GPT x Embeddingで質疑応答を試す」
wemotion
0
84
第9回 社内勉強会「ChatGPTを使い倒そう」
wemotion
0
230
第8回 社内勉強会 「サーバーを構築してWebページを公開してみよう」
wemotion
0
160
第5回 社内勉強会 「設計 後編」
wemotion
0
110
第4回 社内勉強会 「設計 前編」
wemotion
0
150
第3回 社内勉強会 「要件定義 後編」
wemotion
1
170
第2回 社内勉強会 「要件定義 前編」
wemotion
1
340
第1回 社内勉強会 「セキュアプログラミング」
wemotion
0
260
Other Decks in Programming
See All in Programming
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
AIで効率化できた業務・日常
ochtum
0
150
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
400
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
14
6.8k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.5k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
220
act1-costs.pdf
sumedhbala
0
110
Featured
See All Featured
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
220
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Statistics for Hackers
jakevdp
799
230k
Designing for Timeless Needs
cassininazir
1
260
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Transcript
REST APIを作ってみよう 第7回 社内勉強会 2022/12/24
準備
Docker環境を構築し、 dockerとdocker-composeコマンドを使用できるようにする Windows編 https://media.wemotion.co.jp/technology/docker-windows/ Mac編 https://media.wemotion.co.jp/technology/docker-mac/ Docker環境構築
PostmanはGUI上からHTTPリクエストを自由度高く発行することができる PostmanをChrome Extensionsからインストール https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja Postmanインストール ※ 初回実行時にGoogleアカウンなどで無料登録(簡単な質問回答)とSign Inが必要
PHPの代表的なフレームワーク MVCモデルを採用している M: Model V: View C: Controller LaravelでREST
APIを開発 出典: https://laravel.com/
gitコマンドが使用可能な場合は git clone gitコマンドを使用しない場合は「Download ZIP」して解凍 https://github.com/wemotion-inc/docker-laravel-api 第7回 勉強会用 リポジトリ
ソースコードの準備 git clone or Download ZIP にてソースコードを取得
ダウンロードしたディレクトリに入り、コンテナの初回起動を行う PHP環境、DB(MySQL)環境、Webサーバー(Nginx)環境を、 一発でコンテナ上に構築できるよう設定済み コンテナ準備 # docker-composeでコンテナ起動(初回は必要なリソースをインストール)
docker-compose up -d --build
REST API
REST APIのRESTとは、「Representational State Transfer」の略 代表的な特徴 - 統一されたインターフェイス - ステートレス
- 階層型システム - キャッシュ可能性 - オンデマンドのコード REST APIとは 出典: https://aws.amazon.com/jp/what-is/restful-api/
URIによってリクエストを行うリソースを特定し、 HTTPメソッドを使用することでサーバーサイド(DB)に対して - データ取得 - データ登録 - データ更新 - データ削除
などをHTTPリクエストすることができる 一般的にJSON形式でデータのやりとりを行う REST API概要
HTTPメソッドと用途 メソッド 用途 GET 指定されたURLにあるリソースを 参照する(Read) リクエスト パラメータでフィルター処理をサーバーに指示可能 POST
サーバーにデータを送信し 作成する(Create) PUT サーバー上の既存のリソースを 更新する(Update) DELETE サーバー上のリソースを 削除する(Delete)
REST API I/F設計
要件 本の情報登録、本の一覧取得、本の情報更新、本の削除が可能なAPI 仕様 - 登録情報 - タイトル、著者、出版年 - 絞り込みで一覧取得
- 出版年で絞り込み “本”についてCRUDするREST API
URI設計 URI メソッド 概要 /api/books GET 本の一覧を取得 クエリパラメータ 出版年(published_yaer) で絞り込み
/api/books POST 本の情報を登録 /api/books/{book_id} GET book_idにマッチする本の情報を 取得 /api/books/{book_id} PUT book_idにマッチする本の情報を 更新 /api/books/{book_id} DELETE book_idにマッチする本を 削除
ハンズオン
Docker コンテナ上のPHP環境にLaravelをインストールする Laravelインストール # PHP環境(app)のコンテナに入る docker-compose exec app bash #
Laravelをインストール composer create-project --prefer-dist "laravel/laravel=8.*" . # コンテナからの抜け方 exit
/src/.env ファイルの DB_CONNECTION の部分を以下に差し替え
※ 11~16行目あたり DB接続の設定ファイル作成 DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=database DB_USERNAME=root DB_PASSWORD=password
Laravelのアプリケーションで利用したいテーブルの作成などを行う ※ 直接SQLを書かなくてもPHPの記述からテーブル作成を行うことができる マイグレーション
# PHP環境(app)のコンテナに入る(既に入ってる場合は Migrateへ) docker-compose exec app bash # Migrateを行う php artisan migrate
マイグレーションで作成されたテーブル一覧を見てみる テーブルの確認 # DB環境(MySQL)のコンテナに入る docker-compose exec db bash # MySQLに入る
mysql -u root --password=password # データベース領域指定 use database; # テーブル一覧表示 show tables;
Bookモデルクラス作成 # PHP環境(app)のコンテナ内で実行 php artisan make:model Book --migration
src/app/Models/Book.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Book
extends Model { use HasFactory; protected $fillable = [ 'title', 'author', 'published_year' ]; }
src/database/migrations/xxxx_create_books_table.php public function up() { Schema::create('books', function (Blueprint $table) {
$table->id(); $table->string('title'); $table->string('author'); $table->integer('published_year'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down()
migrate & Bookコントローラー作成 # PHP環境(app)のコンテナ内で実行 php artisan migrate # コントローラー作成
php artisan make:controller BookController --api
routes/api.php <?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\BookController; Route::middleware('auth:sanctum')->get('/user', function
(Request $request) { return $request->user(); }); Route::apiResource('/books', BookController::class);
ルーティング確認 # PHP環境(app)のコンテナ内で実行 php artisan route:list
コントローラー メソッド追加(POST) app/Http/Controllers/BookController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Book;
class BookController extends Controller { /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $book = Book::create($request->all()); return response()->json( $book, 201 ); }
コントローラー メソッド追加(GET) <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Book; class
BookController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $books = Book::all(); return response()->json( $books, 200 ); }
PostmanからPOST(データ登録)してみる 「POST」を選択 URL: http://localhost:8081/api/books Bodyに「JSON (application/json)」形式で title, author, published_yearを設定
Sendを実行して Statusが201 Createdなら登録成功!
PostmanからGET(データ取得)してみる 「GET」を選択 URL: http://localhost:8081/api/books Sendを実行して Statusが200 OKで 登録したJSONが返って来れば成功!
コントローラー メソッド追加(GET 1件) /** * Display the specified resource. *
* @param int $id * @return \Illuminate\Http\Response */ public function show($id) { $book = Book::where('id', $id)->get(); if ($book) { return response()->json( $book, 200 ); } else { return response()->json( [ 'message' => "Book $id not found" ], 404 ); } }
PostmanからGET(book_idで取得)してみる 「GET」を選択 book_id=4を取得したい場合 URL: http://localhost:8081/api/books/4 Sendを実行して Statusが200 OKで指定のbook_idを持つ JSONが返って来れば成功!
コントローラー メソッド追加(UPDATE) /** * Update the specified resource in storage.
* * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { $update = [ 'title' => $request->title, 'author' => $request->author, 'published_year' => $request->published_year ]; $book = Book::where('id', $id)->update($update); if ($book) { return response()->json( $book, 201 ); } else { return response()->json([ 'message' => 'Book not found', ], 404); } }
PostmanからUPDATE(データ更新)してみる 「PUT」を選択 book_id=4をデータ更新したい場合 URL: http://localhost:8081/api/books/4 Bodyに「JSON (application/json)」形式で 更新後のtitle, author, published_yearを設定
Sendを実行して Statusが201 Createdで更新成功!
コントローラー メソッド追加(DELETE) /** * Remove the specified resource from storage.
* * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { $book = Book::where('id', $id)->delete(); if ($book) { return response()->json([ 'message' => 'Book deleted successfully', ], 202); } else { return response()->json([ 'message' => 'Book not found', ], 404); } }
PostmanからDELETE(データ削除)してみる 「DELETE」を選択 book_id=5をデータ更新したい場合 URL: http://localhost:8081/api/books/5 Sendを実行して Statusが202 Acceptedで削除成功!
コントローラー メソッド追加(GET 絞り込み) /** * Display a listing of the
resource. * * @return \Illuminate\Http\Response */ public function index(Request $request) { $published_year = $request->query('published_year'); if ($published_year) { $books = Book::where('published_year', $published_year)->get(); } else { $books = Book::all(); } return response()->json( $books, 200 ); }
PostmanからGET(絞り込み)してみる 「GET」を選択 published_year=2022のデータを取得したい場合 URL: http://localhost:8081/api/books?published_year=2022 Sendを実行して Statusが200
OKで成功!
app\Http\Controllers\BookController.php https://github.com/wemotion-inc/docker-laravel-api/wiki/app%5CHttp%5CControllers%5 CBookController.php
None