iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1

Create、Read、Update、Delete是基本資料庫操作方式,但每個方法都寫一個router uri跟controller這樣的工作量太大也不合理,因此建議使用 RESTful API來處理。

REST是一種設計風格,全名為 Representational State Transfer 。

  • Representational:表現形式,如JSON,XML...
  • State Transfer:狀態變化。即上述講到的可利用HTTP動詞們來做呼叫。

符合RESTful API,可以讓router裡的action name減少,透過同一組名稱使用http原生方法達到API操作,讓URI設計易理解易閱讀。

Laravel有幾種產生RESTful API的方式,這篇的model名稱以userWater(個人飲水為例),分述如下

controller --resource

php artisan make:controller userWater --resource

controller內會 自動產生以下7種method
public function index()
public function create()
public function store(Request $request)
public function show($id)
public function edit($id)
public function update(Request $request, $id)
public function destroy($id)

controller --api

php artisan make:controller userWater --api

controller內會自動產生以下5種method
public function index()
public function store(Request $request)
public function show($id)
public function update(Request $request, $id)
public function destroy($id)

model -rmc

php artisan make:model userWater -rmc

terminal response如下

Model created successfully.
Created Migration: 2020_09_12_160653_create_user_waters_table
Controller created successfully.

可看到指令會產生除了7種方法的controller之外,還提供了model、table。

router設定

Laravel 提供了RESTful更簡潔的寫法

//1組寫法
Route::apiResource('userWater', 'UserWaterController');

//2組寫法
Route::apiResources([
    'userWater' => 'UserWaterController',
    'posts' => 'PostController',
]);

使用Route::apiResource的寫法,可對應在官網文件中,可以知道7種controller的方法(Action)分別對應的路由(URI)如下

Http Verb URI Action Route Name
GET /userWater index userWater.index
GET /userWater/create create userWater.create
POST /userWater store userWater.store
GET /userWater/{userWater} show userWater.show
GET /userWater/{userWater}/edit edit userWater.edit
PUT/PATCH /userWater/{userWater} update userWater.update
DELETE /userWater/{userWater} destroy userWater.delete

建立好model、migrate完table,加上了解以上路由對應的方法後,就可以開始處理RESTful API囉!

以新增一筆userWater(飲水紀錄為例),寫在 store的 action中

   /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //要validate的rules
        $rules = [
            "user_id" => "required|string | regex:/^[0-9]+$/",
            "water" => "required | integer "
        ];
        //回覆validate錯誤訊息
        $validResult = $this->customValidate($request, $rules);
        if (!is_null($validResult)){
            return response()->json(['success' => false, 'message' =>$validResult , 'data'=> null ],400);
        }
    
        //新增一筆
        $newRecord = userWater::create([
                'user_id' => $request->user_id,
                'water' => $request->water
            ]);
        //判斷成功或失敗,提供回覆資訊
        if ($newRecord) {
            return response()->json(['success' => true, 'message' => "add success", 'data' => null], 200);
        } else {
            return response()->json(['success' => false, 'message' => "add error", 'data' => null], 400);
        }

    }

成功就回覆http status code 200。
失敗就回覆http status code 400,並加上失敗原因提示。


參考資料
https://medium.com/itsems-frontend/api-%E6%98%AF%E4%BB%80%E9%BA%BC-restful-api-%E5%8F%88%E6%98%AF%E4%BB%80%E9%BA%BC-a001a85ab638
https://www.footmark.info/programming-language/design/restful-webapi-design-guide/
https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E6%93%8D%E7%B8%B1%E8%AA%9E%E8%A8%80
https://ithelp.ithome.com.tw/articles/10227685
https://laravel.com/docs/7.x/controllers


上一篇
Middleware (2):API Log
下一篇
RESTful API (2) :Response
系列文
30天開發與部署 Laravel 專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言