昨天了解了 Request,今天要來看 Response,對於 Response 最直接的想法就是將伺服器的處理結果傳遞回客戶端。
每次當應用程式收到一個 Request,最後都會產生一個 Response。
一句話,我的理解是 HTTP Response 就是跟使用者之間的對話,回應他們 Request 的方式。
我覺得理解 HTTP Response 可以幫助我們有效控制應用的行為,像是:
當我們用 Laravel 開發網站,使用者點擊某個網址或執行某個功能時,系統需要把一個回應發回給瀏覽器。這樣使用者才能看到想要的內容或界面。這裡會返回字串、數組或 Eloquent 模型,Laravel 會自動轉換為相應的回應格式。
基本回應:從路由或控制器返回字串,Laravel會自動轉換為HTTP回應。
Route::get('/', function () {
return 'Hello World';
});
返回數組:數組將自動轉換為JSON格式。
Route::get('/', function () {
return [1, 2, 3];
});
返回Eloquent模型:自動轉換為JSON格式。
Route::get('/user/{user}', function (User $user) {
return $user;
});
傳回狀態碼:返回完整的 Response 實例以自訂 HTTP 狀態碼和標頭。
return response('Hello World', 200)->header('Content-Type', 'text/plain');
大部分的回應方法都是可以連續使用的,這樣可以方便地構建回應。
我們可以使用 header
或 withHeaders
方法為回應添加 headers ,用來告訴瀏覽器如何處理 Response。
使用 header
方法可以為回應添加多個 header。
return response($content)
->header('Content-Type', 'text/plain')
->header('X-Header-One', 'Header Value');
使用 withHeaders
方法可以傳遞一組 header。
return response($content)->withHeaders([
'Content-Type' => 'text/plain',
'X-Header-One' => 'Header Value',
]);
將 Cookies 附加到回應是一個重要的功能,能夠幫助使用者的瀏覽器記住關鍵資訊,如登錄狀態和個人偏好。開發者可以使用 cookie
方法將 Cookies 添加到回應中,指定名稱、值和有效時間。若尚未創建回應實例,則可以使用 Cookie facade 的 queue
方法排隊添加 Cookies,確保它們在回應發送時一併附上,方便管理使用者的會話和偏好設置。
使用 cookie
方法可以將 Cookie 附加到回應中,並提供其名稱、值和有效時間(幾分鐘)
return response('Hello World')->cookie('name', 'value', $minutes);
如果需要在沒有回應實例的情況下附加 Cookie,可以使用 Cookie facade 的 queue
方法。這樣,當回應發送時,這些 Cookie 就會自動附加上去。
use Illuminate\Support\Facades\Cookie;
Cookie::queue('name', 'value', $minutes);
在 Laravel 中,Redirect 回應是在 Illuminate\Http\RedirectResponse
類別中。使用 redirect
方法 Redirect 到新的 URL、命名路由或控制器操作。
使用 redirect
方法,能夠將使用者導向其他網址。
return redirect('/home/dashboard');
需要將使用者導回之前的頁面(例如表單提交無效時),可以使用 back
方法函數,但這需要確保路由使用 web 中間件
Route::post('/user/profile', function () {
return back()->withInput();
});
可以 Redirect
到命名路由或控制器操作。
// 透過命名路由生成 Redirect ,使用 route 方法傳遞參數
return redirect()->route('login');
// 需要 Redirect 到控制器操作時,則可以使用 action 方法:
return redirect()->action([UserController::class, 'index']);
使用 back
函數可以將使用者 Redirect 回前一頁,withInput()
方法會將當前請求的輸入資料暫時儲存到會話中,以便在重定向後可以重新填充表單。
return back()->withInput();
Laravel 提供了一個 response
小幫手,可以用來生成不同類型的回應實例。當不帶參數呼叫 response
小幫手時,它會返回一個 Illuminate\Contracts\Routing\ResponseFactory
,可以生成不同類型的回應,如視圖、JSON、文件下載等。
查看回應:使用 view
方法,在需要控制回應的狀態和標頭,同時又要返回視圖時。
return response()->view('hello', $data);
JSON 回應:使用 json
方法,可以自動設置 Content-Type
headers 為 application/json
,並將數組轉換為 JSON。
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
文件下載:使用 download
方法強制瀏覽器下載文件。
return response()->download($pathToFile, 'filename.txt');
串流回應:使用stream
方法,允許在伺服器傳送資料的同時,客戶端開始處理資料,可以逐步發送數據,適合大數據的情況。
Route::get('/stream', function () {
return response()->stream(function (): void {
// 產生資料的邏輯
}, 200, ['X-Accel-Buffering' => 'no']);
});
串流 JSON 回應:使用streamJson
方法,可以逐步串流 JSON 數據,適合大數據的情況
use App\Models\User;
return response()->streamJson(['users' => User::cursor()]);
串流下載:使用streamDownload
方法,可以將字串回應轉換為可下載的回應,無需先將資料儲存為檔案在伺服器上,這樣可以節省磁碟空間和時間。
use App\Services\GitHub;
return response()->streamDownload(function () {
// 生成內容的邏輯
}, 'filename.md');
了解這些基本概念能幫助我有效地管理伺服器與使用者之間的溝通,透過正確的回應,能夠更好地處理用戶請求、減少錯誤,並優化應用的性能。Laravel 提供的多樣化回應選項,如字串、JSON、文件下載等,未來還有許多技術等待我去學習,還是要持續在開發的路上不斷進步!
參考資料
踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
寶劍騎士:今天抽到這張牌,我還以為我可以寫得很快,結果是在告訴我,時間會過得很快...,明天繼續衝衝!
「想做的事情好多好多卻都沒做,想說還有時間慢慢來,怎麼知道時間一下就過了,才發現自己什麼都沒做就老了。」
-俗女養成記>