iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Modern Web

後端菜雞仔想學 Laravel系列 第 13

為什麼找不到資料就是 404 不是 444 呢?:關於 HTTP 狀態碼

  • 分享至 

  • xImage
  •  

線上產品瀏覽系統的 API 規劃

Method URI Name Action
POST api/products/ product.store App\Http\Controllers\ProductController@store
GET api/products/ product.index App\Http\Controllers\ProductController@index
GET api/products/{product} product.show App\Http\Controllers\ProductController@show
PATCH api/products/{product} product.update App\Http\Controllers\ProductController@update
DELETE api/products/{product} product.destroy App\Http\Controllers\ProductController@destroy

Controller & Route:來指派店長跟分配店員吧! 的文章有先做過「新增產品」的範例,今天來試試不同區域的工作流程範例。

刪除產品

有新增產品就有刪除產品。

[ DELETE ] api/products/{product} 對應到的是 ProductController 的 destory 方法

有找到資料,然後刪除成功,會回傳 Http 狀態碼:204 No Content 

如果找不到資料即會回傳 Http 狀態碼:404 Not Found

ProductController.php


/**
 * Remove the specified resource from storage.
 * 刪除指定 ID 的商品
 * @param  \App\Models\Product  $product
 * @return \Illuminate\Http\Response
 */
public function destroy(Product $product)
    {
        // 刪除商品
        $product->delete();

        // 如果成功刪除就回傳空白內容並給 204 狀態碼
        return response(null, Response::HTTP_NO_CONTENT);
    }

關於 HTTP 狀態碼

HTTP 狀態碼其實是網路上大家約定俗成的標準,好比說常見的 404 Not Found 就是告訴你「這個頁面找不到」,或是 500 Internal Server Error 表示「伺服器出錯了」。
這些狀態碼都是由 IETF(Internet Engineering Task Force)制定的標準,基本上每個網頁、每個伺服器都遵守這些規範。

菜雞仔如我,當初查詢資料第一次看到 HTTP 狀態碼 就在思考像: 204 No Content 跟 404 Not Found 這些所謂的 HTTP 狀態碼 是從哪裡定義的呢?
為什麼找不到資料就是 404?為什麼不是 444 呢?
當然在開發過程中,你也可以自定義為 444 Not Found :找不到資料就死死死定了(誤)

但是,可以自定義嗎?

技術上可以自定義,你可以在程式碼中自己回傳一個自定義的狀態碼,比如把 404 改成 444,但這樣做其實會有一些潛在問題:

  • HTTP 的狀態碼是全球通用的,大部分的瀏覽器或應用程式是根據既定的 HTTP 狀態碼來決定接下來的行動。
    如果你回傳一個 444,瀏覽器會不知道這到底代表什麼意思,可能會出現奇怪的行為,甚至無法正確處理這個錯誤。

  • 你自己創造一個狀態碼的話,對其他人來說就會很難理解,在除錯上就會比較困難。
    例如:一個開發者看到 444 可能會想:「這是什麼?是錯誤嗎?還是其他問題?」
    如果大家都用標準的 404、500 這些狀態碼,就能馬上知道發生了什麼事,但如果用自定義的狀態碼,別人可能要花更多時間來理解問題。

HTTP 狀態碼常數的定義

在 Laravel 中,這些常數被定義在 Illuminate\Http\Response 類中,以下整理 GPT 提供的資料:

Illuminate\Http\Response 類中部分常數的定義:

namespace Illuminate\Http;

class Response extends \Symfony\Component\HttpFoundation\Response
{
    const HTTP_CONTINUE = 100;
    const HTTP_SWITCHING_PROTOCOLS = 101;
    const HTTP_PROCESSING = 102;            // RFC2518

    const HTTP_OK = 200;
    const HTTP_CREATED = 201;
    const HTTP_ACCEPTED = 202;
    const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
    const HTTP_NO_CONTENT = 204;
    const HTTP_RESET_CONTENT = 205;
    const HTTP_PARTIAL_CONTENT = 206;
    const HTTP_MULTI_STATUS = 207;          // RFC4918
    const HTTP_ALREADY_REPORTED = 208;      // RFC5842
    const HTTP_IM_USED = 226;               // RFC3229

    // 其他狀態碼...
}

常見的 HTTP 狀態碼和其常數

以下是一些常見的 HTTP 狀態碼及其在 Laravel 中的常數名稱:

  • 200 OKResponse::HTTP_OK
  • 201 Created(已創建)Response::HTTP_CREATED
  • 400 Bad Request(錯誤的請求)Response::HTTP_BAD_REQUEST
  • 401 Unauthorized(未經授權)Response::HTTP_UNAUTHORIZED
  • 403 Forbidden(禁止)Response::HTTP_FORBIDDEN
  • 404 Not Found(沒有找到)Response::HTTP_NOT_FOUND
  • 500 Internal Server Error(內部伺服器錯誤)Response::HTTP_INTERNAL_SERVER_ERROR

基於什麼規則創造的?

這些常數基於 HTTP 規範(如 RFC 7231、RFC 2518 等)創造的,每個常數對應於一個標準的 HTTP 狀態碼。這樣做的好處包括:

  1. 提高可讀性:常數名稱比數字碼更具描述性,可以讓程式碼更易於理解。
  2. 減少錯誤:使用常數避免了手動輸入數字,減少了出錯的可能性。
  3. 一致性:在整個應用程序中使用統一的狀態碼表示方式。

可以參考: Laravel 官方文件
這篇文章也可以搭配著看: 基本的 HTTP status code,像是 200、301、400、404、500

使用 Postman 測試

https://ithelp.ithome.com.tw/upload/images/20240927/201693001CA3nAL7gz.jpg

  • 選擇 DELETE
  • 輸入網址:127.0.0.1:8000/api/products/1
  • 點選 Headers
    Key:Accept
    Value:application/json
  • 按下 Send 送出
  • 狀態顯示 204 並出現資料內容為空白即刪除成功!

如果再按一次 Send 送出:

https://ithelp.ithome.com.tw/upload/images/20240927/20169300Iws6EzJ2Xa.jpg

  • 狀態顯示 404 並出現報錯訊息,因為已經沒有 id 1 的資料可以被刪除!

上一篇
Git & GitHub:派遣你的時光機!
系列文
後端菜雞仔想學 Laravel13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言