iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 7
1
Modern Web

使用 Laravel 打造 RESTful API系列 第 7

刪除動物以及異常處理

今天也是先把簡單的處理完,今天來製作,刪除動物功能。

Method URI Name Action Middleward
DELETE api/animal/{animal} anumal.destroy AnimalController@destroy api

用 HTTP DELETE 動詞請求 api/animal/1 表示刪除 id 為 1 的動物資料。

AnimalController

// 路由有設定 animal 變數,這裡設定它是 Animal 模型,所以會自動找出該ID的實體物件
public function destroy(Animal $animal)
{
    // 把這個實體物件刪除
    $animal->delete();
    // 回傳 null 並且給予 204 狀態碼
    return response(null, Response::HTTP_NO_CONTENT);
}

完成!簡單吧!補充一下返回的response 通常我都怎麼寫的。

Delete 動詞方法如何回應資料

我都是這樣做

有找到資料,然後刪除成功,我會回傳狀態碼 204 (No Content) 的回應

可能有些需要由後端處理,檔案比較大或系統流量大,不想要讓使用者等,可以先回傳 202 (Accepted) 表示你的請求,伺服器有收到,排隊等待處理中還沒有被執行,讓前端介面有對應的處理方式不需要等待,提升使用者體驗。

如果找不到資源 回傳 404 Not Found

嘗試可不可以運行

打開 Postman 動作改為 DELETE

Headers 如下圖顯示即可
postman設定

按下Send animals資料表原本有一筆資料就會被刪除囉!

資料庫內容

如果這時候再送一次請求呢?

再送一次出現錯誤了

再送一次請求以後發現出現錯誤了 QQ

異常處理

我們來處理一下這個異常

/animal/app/Exceptions/Handler.php

public function render($request, Exception $exception)
{
    // 讓它顯示一下是哪一個異常狀況
    dd($exception);
    
    return parent::render($request, $exception);
}

在render 方法中 加入 dd($exception) 讓他印出異常,Postman 再送一次請求

印出異常

發現是 ModelNotFoundException 這個例外,我們來攔截這個異常

因為ID:1 的內容已經不存在資料表了,導致出現狀況

把攔截錯誤的程式碼寫在 render 方法中(原本印出異常的程式碼 dd($exception); 可以刪掉)

use Illuminate\Database\Eloquent\ModelNotFoundException;

public function render($request, Exception $exception)
{
    if ($request->expectsJson()) {
        if ($exception instanceof ModelNotFoundException) {
            return response()->json(
                [
                    'error' => '找不到資源'
                ],
                Response::HTTP_NOT_FOUND
            );
        }
    }
    return parent::render($request, $exception);
}

程式碼解釋,使用者請求回傳JSON 格式,發現有錯誤 ModelNotFoundException 被拋出,因為Model 沒有抓到資料,回傳 404 Not Found 並附上錯誤資訊。

再送一次相同請求!如下圖表示成功囉!

正確顯示錯誤訊息

此篇文章同步發到個人部落格


上一篇
實作資料庫以及新建動物的方法
下一篇
更新動物資料
系列文
使用 Laravel 打造 RESTful API30

1 則留言

0

use use Illuminate\Database\Eloquent\ModelNotFoundException;
這段多了一個use

Victor iT邦新手 4 級 ‧ 2020-10-30 09:26:25 檢舉

謝謝你/images/emoticon/emoticon41.gif

我要留言

立即登入留言