iT邦幫忙

2024 iThome 鐵人賽

DAY 19
1
Software Development

Laravel 隨筆學習札記系列 第 19

Day19 - Laravel Request 的力量:簡化 HTTP 請求處理

  • 分享至 

  • xImage
  •  

來唷! 今天來了解 HTTP Requests 吧~

為什麼我們需要知道 HTTP Requests 呢?

1. 客戶端與伺服器之間的溝通

HTTP 請求就像是你在網頁上點擊一個連結,然後瀏覽器會向伺服器發送請求,「我想要獲取那個網頁或圖片」。
這是互聯網運作的基礎,沒有它,我們無法瀏覽網頁或查看內容。

2. 資源管理

HTTP 有不同的方法。
比如,GET 是用來請求資料的,而 POST 則是用來提交資料的。
這讓開發者能夠有效地管理和操作網站上的數據。

3. 安全性考量

了解 HTTP 請求也能幫助你識別安全問題。
普通的 HTTP 請求是明文傳輸的,這意味著資訊容易被竊聽。因此,使用 HTTPS(安全版的 HTTP)來加密資料是非常重要的,這樣可以保護密碼和信用卡號等敏感信息。

4. 狀態碼和響應處理

當你發送請求後,伺服器會回應一個狀態碼。
比如 200 表示成功,404 表示找不到頁面。
理解這些狀態碼能幫助開發者更好地處理錯誤和調試網站。

5. API 開發

在開發 API 時,HTTP 請求是實現各種功能(如創建、讀取、更新和刪除)的基礎。
熟悉 HTTP 請求的結構和方法對於設計高效的 API 很重要。


Laravel Request 是什麼?

來看看官方文件怎麼說吧!

Laravel's Illuminate\Http\Request class provides an object-oriented way to interact with the current HTTP request being handled by your application as well as retrieve the input, cookies, and files that were submitted with the request.

我理解的意思是:
Laravel 的 Illuminate\Http\Request 類別是一個非常有用的工具,它讓開發者能夠方便地處理應用程式中的 HTTP 請求。當用戶在瀏覽器中發送請求到你的 Laravel 應用時,這個請求會被轉換成一個 Request 物件。開發者可以使用這個物件來檢查請求的各種細節,例如請求的 URL、HTTP 方法,甚至是用戶提交的表單資料。


Interacting With The Request

Accessing the Request

在 Laravel 中,HTTP 請求的處理主要是透過 Request 物件來進行。
可以使用依賴注入的方式在控制器中獲取請求實例,或使用全局輔助函數 request()

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
 
class UserController extends Controller
{
    /**
     * Store a new user.
     */
    public function store(Request $request): RedirectResponse
    {
		    // 使用依賴注入的方式
		    $data = $request->all();

		    // 或者使用全局輔助函數
		    $data = request()->all();
		 }
}

Request Path, Host, and Method

以請求 URL http://example.com/foo/bar 為例

  • 請求路徑$request->path()
    • 此方法返回請求的路徑資訊,不包括主機名和協議部分。
    • 返回的是 foo/bar
  • 主機名$request->host()
    • 此方法返回請求的主機名。
    • 返回的是 example.com

以請求 URL http://example.com/foo/bar?type=phone 為例

  • 請求 URL$request->url() / $request->fullUrl()
    • $request->url()
      • url() 方法返回不帶查詢字串的請求 URL。
      • 返回的是 http://example.com/foo/bar
    • $request->fullUrl()
      • fullUrl() 方法返回包含查詢字串的完整 URL
      • 返回的是 http://example.com/foo/bar?type=phone
  • 請求方法$request->method()
    • 此方法返回 HTTP 請求的動詞(例如 GET、POST)。這有助於確定請求的類型和行為。
public function show(Request $request)
{
    $path = $request->path(); // 獲取請求路徑
    $host = $request->host(); // 獲取主機名
    $url = $request->url(); // 獲取不帶查詢字串的 URL
    $fullUrl = $request->fullUrl(); // 獲取包含查詢字串的完整 URL
    $method = $request->method(); // 獲取請求方法

    return response()->json([
        'path' => $path,
        'host' => $host,
        'url' => $url,
        'full_url' => $fullUrl,
        'method' => $method,
    ]);
}

Request Headers

Request Headers 像是附加在 HTTP 請求上的一些信息,幫助伺服器了解請求的背景。
例如,這些 Headers 可以告訴伺服器你是誰、你用什麼設備發送 Request 等。

  1. 使用 header 方法

    • 可以用 header 方法來獲取特定的 Request Headers。如果這個Headers 不存在,會返回 null
    • 我們也可以提供一個預設值,如果 Headers 不存在,則返回這個預設值。
    // 獲取名為 'X-Header-Name' 的 Headers
    // 如果不存在,返回 null
    $value = $request->header('X-Header-Name'); 
    
    // 獲取 Headers,並設定預設值為 'default'
    // 如果不存在,返回 'default'
    $value = $request->header('X-Header-Name', 'default'); 
    
  2. 使用 hasHeader 方法

    • 這個方法可以確認請求中是否有特定的 Headers。
    // 檢查 Headers 是否存在
    if ($request->hasHeader('X-Header-Name')) {
        // Headers 存在,可以進行後續處理
    }
    
    
  3. 使用 bearerToken 方法

    • 如果需要從請求中獲取 bearer token (通常用於身份驗證),可以使用這個方法。如果請求中沒有這個 Headers則返回一個空字串。
    // 獲取 Bearer Token
    // 如果不存在,返回空字串
    $token = $request->bearerToken();
    

Request IP Address

獲取發送請求的客戶端的 IP 位址。
這在許多應用場景中都非常有用,例如安全檢查、訪問限制等。

  1. 使用 ip 方法:可以獲取發送請求的客戶端的 IP 位址。

    // 獲取客戶端 IP 位址
    $ipAddress = $request->ip();
    
  2. 使用 ips 方法:如果應用程式使用了代理,並且你想獲取所有經過的 IP 位址,可以使用這個方法。會返回一個數組,其中包括所有轉發的 IP 位址。

    // 獲取所有客戶端 IP 位址
    $ipAddresses = $request->ips();
    
  3. 安全提示: IP 位址應該被視為不受信任的輸入。因為用戶可以輕易地修改他們的 IP 位址,這些資訊應僅用於參考或日誌記錄,而不應依賴於它們來進行安全性決策。


Input

Retrieving Input

  • 檢索所有輸入數據

    • 檢索所有數據:使用 all() 方法可以獲取所有傳入請求的輸入數據,返回一個陣列。

      $input = $request->all();
      
    • 使用 collect() 方法獲取所有數據作為集合

      $input = $request->collect();
      
    • 檢索特定子集:使用 collect('users') 可以獲取特定的輸入子集。

      $request->collect('users')->each(function (string $user) {
          // ...
      });
      
  • 檢索特定輸入值

    • 基本檢索:使用 input() 方法來獲取特定的輸入值,並可在第二個參數設置預設值。

      $name = $request->input('name', 'Sally');
      
    • 陣列輸入:對於包含陣列的表單,使用「dot」表示法來訪問。

      $name = $request->input('products.0.name');
      $names = $request->input('products.*.name');
      
    • 檢索所有輸入作為關聯陣列:不帶參數調用 input() 方法可獲取所有輸入值。

      $input = $request->input();
      
  • 從查詢字串中檢索:使用 query() 方法僅從查詢字串中獲取值

    $name = $request->query('name', 'Helen');
    
  • 處理 JSON 請求:當請求為 JSON 格式時,可以通過 input() 方法訪問 JSON 數據,使用「dot」表示法來訪問。

    $name = $request->input('user.name');
    
  • 獲取字串 string()、整數 integer()、布林值 boolean()、日期 date()

    $name = $request->string('name')->trim(); //獲取字串
    $perPage = $request->integer('per_page'); //獲取整數
    $archived = $request->boolean('archived'); //獲取布林值
    $birthday = $request->date('birthday'); //獲取日期
    
  • 動態屬性訪問:可以通過動態屬性直接訪問請求中的輸入值。

    $name = $request->name;
    
  • 只獲取特定鍵的數據:使用 only()except() 方法來獲取部分數據。

    $input = $request->only(['username', 'password']);
    $input = $request->except(['credit_card']);
    

Input Presence

  • 簡化請求處理:使用 Laravel 的 Request 類別,開發者可以輕鬆地訪問和操作 HTTP 請求中的數據,避免直接使用 PHP 的全域變數。
  • 提高可讀性:這些方法提供了清晰且一致的 API,使得代碼更具可讀性和可維護性。
  • 方便驗證:許多方法內建了驗證機制,能夠快速檢查請求中的數據是否符合預期,減少錯誤發生的機會。
  • 條件執行:可以根據請求中數據的存在性或狀態執行不同的邏輯,增強了代碼的靈活性。
方法名稱 說明
has 確認請求中是否存在特定值。
hasAny 確認請求中是否存在任一指定值。
whenHas 如果請求中存在特定值,執行給定的閉包。
filled 確認請求中是否存在且不是空字串的值。
isNotFilled 確認請求中是否缺少某個值或該值為空字串。
anyFilled 如果任何指定的值不是空字串,則返回 true。
whenFilled 如果請求中存在且不是空字串的值,執行給定的閉包。
missing 確認請求中是否缺少特定鍵。
whenMissing 如果請求中缺少特定鍵,執行給定的閉包。

Cookies

  • 安全性:所有由 Laravel 創建的 Cookie 都經過加密並使用身份驗證碼簽名,這意味著如果用戶端對其進行更改,這些 Cookie 將被視為無效。這樣可以防止惡意用戶篡改 Cookie 中的數據。
  • 隱私保護:通過加密,Cookie 中的敏感數據(如用戶身份或會話信息)不會被直接讀取或修改。

可以通過 $request->cookie('cookie_name') 獲取請求中的 cookie。

public function getCookie(Request $request)
{
    $cookieValue = $request->cookie('user_session');

    return response()->json([
        'cookie' => $cookieValue,
    ]);
}

參考資料

  1. Laravel — The Basics — Requests (官方文件原子化翻譯)
  2. Laravel Request 概念
  3. Laravel官方網站:HTTP Requests

踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
寶劍三:在寫的當天,是颱風假的第三天,放假在家就能好好沉澱,跟自己對話,整理思緒

Be who you are right now.

做好你現在的角色。

—《Toy Story 4》


上一篇
Day18 - Laravel Middleware:隱藏在應用背後的守護者
下一篇
Day20 - 從請求到回應:探索 Laravel 的 Request Lifecycle
系列文
Laravel 隨筆學習札記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言