Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第7回 社内勉強会 「REST APIを作ってみよう」

第7回 社内勉強会 「REST APIを作ってみよう」

Avatar for Wemotion, Inc

Wemotion, Inc

December 24, 2022
Tweet

More Decks by Wemotion, Inc

Other Decks in Programming

Transcript

  1. REST APIのRESTとは、「Representational State Transfer」の略
 
 代表的な特徴
 - 統一されたインターフェイス
 - ステートレス


    - 階層型システム
 - キャッシュ可能性
 - オンデマンドのコード
 REST APIとは
 出典: https://aws.amazon.com/jp/what-is/restful-api/ 

  2. HTTPメソッドと用途
 メソッド
 用途
 GET
 指定されたURLにあるリソースを 参照する(Read)
 リクエスト パラメータでフィルター処理をサーバーに指示可能 
 POST


    サーバーにデータを送信し 作成する(Create)
 PUT
 サーバー上の既存のリソースを 更新する(Update)
 DELETE
 サーバー上のリソースを 削除する(Delete)

  3. 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にマッチする本を 削除

  4. Docker コンテナ上のPHP環境にLaravelをインストールする
 Laravelインストール
 # PHP環境(app)のコンテナに入る docker-compose exec app bash #

    Laravelをインストール composer create-project --prefer-dist "laravel/laravel=8.*" . # コンテナからの抜け方 exit
  5. /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
  6. 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()
  7. コントローラー メソッド追加(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 ); }
  8. コントローラー メソッド追加(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 ); }
  9. コントローラー メソッド追加(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 ); } }
  10. コントローラー メソッド追加(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); } }
  11. コントローラー メソッド追加(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); } }
  12. コントローラー メソッド追加(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 ); }