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

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

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

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 ); }