HTTP Response Là Gì? Cách Thiết Lập Thông Tin Trả Về Trong Laravel

HTTP Response Là Gì? Cách Thiết Lập Thông Tin Trả Về Trong Laravel
Học Laravel mà không biết HTTP response là lãng phí. Chúng ta hãy cùng nhanh nhanh tìm hiểu nó để sử dụng Laravel thành thạo.

Laravel có nhiều component, điển hình là HTTP response và HTTP request (ở bài viết sau, các bạn sẽ hiểu về HTTP request). HTTP response không có gì phức tạp. Bạn chỉ cần lưu ý sử dụng các cú pháp sao cho đúng và hiểu rõ ràng từng tính năng là được.

 

Protocol là gì?

 

Để biết HTTP và HTTP response là gì, các bạn cần tìm hiểu protocol. Protocol là hệ thống các quy tắc nhất định nhằm định nghĩa các dữ liệu được trao đổi giữa nhiều máy tính khác nhau. Vì sao phải có protocol? Nếu không có protocol, chuyện định dạng dữ liệu từ thiết bị A đến thiết bị B sẽ bị sai lệch. Thiết bị B sẽ không hiểu đúng thiết bị A đã truyền cái gì đến mình. Ví dụ: thiết bị A mã hóa base64, nhưng thiết bị B không đọc ra đúng đoạn mã hóa đó. Thiết bị B sẽ đọc ra một chuỗi dữ liệu dài bất tận. Nhờ có protocol, đôi bên sẽ hiểu ý nhau và quan trọng nhất, đó là hiểu chính xác.

 

Mô hình giao thức 

 

Mỗi lần mà người dùng bắt đầu sử dụng trình duyệt và truy cập vào một trang web, đó là lúc một phiên làm việc HTTP (còn được gọi là session) được khởi động. Nó được diễn ra với client là máy tính của người dùng và server là máy chủ của website. Khi đó, mặc định HTTP được thực hiện thông qua port 80. Vì sao lại có port này? Vì nó là port chuẩn của giao thức – đã được định nghĩa và chuẩn hóa bởi tổ chức IANA. 

 

HTTP là gì?

 

HTTP (Hypertext Transfer Protocol) là một giao thức giao tiếp siêu văn bản. Vai trò của nó là gửi và nhận các tập tin và các trang web thông qua Internet. Nguyên lý hoạt động của HTTP như thế nào? HTTP sử dụng một tác nhân người dùng (hoặc một trình duyệt) để kết nối đến một máy chủ. Máy chủ đó phải có vị trí và phương pháp để xác định là sử dụng một URL hoặc một URI. Địa chỉ này có các ký tự http:// ở đầu và thường kết nối tới cổng 80 trên một máy tính cụ thể. 

 

HTTP là phi trạng thái. Dù HTTP đến cùng một server và được thực hiện trên cùng một kết nối, nó vẫn không có mối liên hệ giữa hai yêu cầu được gửi đi. Ví dụ web browser gửi một yêu cầu đến địa chỉ http://hoclaravel… thì sẽ nhận về một response. Ngay sau đó, nó cũng sẽ gửi yêu cầu thứ nhì đến địa chỉ http://hoclaravel... thì sẽ được nhận một response khác. Hai truy vấn này là độc lập (không có mối liên hệ nào với nhau).  

 

Khái niệm HTTP response 

 

Thông thường, response có nghĩa là lời phản hồi. Trong thế giới lập trình web, HTTP response là thông báo phản hồi HTTP. Đây được hiểu là kết quả server trả về cho client. Sau khi đã tìm hiểu về route và controller ở bài trước, các bạn đã biết tất cả các route hoặc controller trong Laravel đều phải trả về một response. Laravel có chức năng cung cấp sẵn một response class để hỗ trợ các bạn trả về các loại response data rất đơn giản.

 

Cấu trúc HTTP response gần giống HTTP request. HTTP response khác HTTP request ở chỗ Status-Line. Còn HTTP request là Request-Line. Status-Line có 3 phần: 

  • HTTP-version: phiên bản HTTP cao nhất mà server sẽ hỗ trợ
  • Status-Code: mã kết quả trả về
  • Reason-Phrase: mô tả về Status-Code

 

Response data

 

Khi một route hoặc controller trả về giá trị là chuỗi; thì Laravel sẽ tự động convert nó về dạng một HTTP response. Xem ví dụ sau: 

 

Route::get('/', function () {

    return 'Hello World';

});

Bạn sẽ thấy kết quả:

 

 

Nếu bạn trả về một mảng, Laravel cũng tự động convert về dạng một JSON response. Ví dụ: 

 

Route::get('/', function () {
    return [1, 2, 3];
});

 

Kết quả là: 

 

 

Trong công việc thực tế, các bạn sẽ phải trả về response với các header và status khác nhau. Bạn có thể sử dụng Response (Illuminate\Http\Response) của Laravel. Đồng thời, Laravel cũng đưa Response class vào helper. Khi đó, các bạn có thể sử dụng hàm response() trong helper thay thế response class để thao tác tạo code của bạn sẽ ngắn gọn. 

 

Redirect response

 

Nếu bạn muốn trả về một redirect response, Laravel cung cấp sẵn cho bạn một class Illuminate\Http\RedirectResponse để bạn thực hiện điều đó. Đồng thời, Laravel cũng đưa class đó vào helper để việc sử dụng dễ hơn. Các bạn có thể dùng helper redirect thay cho class. Xem ví dụ sau: Redirect về URL /home/dashboard khi người dùng vào URL /dashboard

 

Route::get('/dashboard', function () {
    return redirect('home/dashboard');
});

 

Dùng hàm back nếu bạn muốn redirect về URL user vừa truy cập không lâu trước đó. Ví dụ: 

 

Route::post('/user/profile', function () {
    // Validate the request...
    return back()->withInput();
});

 

Redirect một route nào đó bằng cách dùng phương thức route. Ví dụ: 

 

return redirect()->route('login');

 

Nếu muốn redirect qua một domain khác, bạn sử dụng phương thức away. Ví dụ: 

 

return redirect()->away('https://www.google.com');

(redirect đến google) 

 

File Response 

 

Để response về 1 file, bạn dùng phương thức file:

 

return response()->download($pathToFile);

 

Hoặc dùng cú pháp: 

 

return response()->download($pathToFile, $name, $headers);

 

  • $pathToFile: đường dẫn đến file bạn muốn trả về 
  • $name: tên của file bạn muốn trả về
  • $header: các header bạn muốn trả về kèm theo trong file response. Cú pháp cũng tương tự như phương thức header ở trên 

Bạn có thể thử response về một file hiển thị trên trình duyệt như PDF bằng cách sử dụng phương thức file với cú pháp sau: 

 

return response()->file($pathToFile);

 

hoặc

 

return response()->file($pathToFile, $headers);

 

  • $pathToFile: đường dẫn đến file bạn muốn trả về
  • $headers: tên của file bạn muốn trả về

 

Đôi khi, bạn cần trả về một nội dung nào đó mà có thể tải về máy được nhưng muốn tránh phải qua bước lưu vào ổ đĩa trước khi tải. Khi đó, bạn nên dùng method stream Download để trả về một stream data. Xem ví dụ sau:

 

return response()->streamDownload(function () {
    echo GitHub::api('repo')
                ->contents()
                ->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');

 

Tạo response cơ bản 

 

Ở phần này, các bạn sẽ tìm hiểu về component response của Laravel. Component này cũng không có gì phức tạp. Bạn chỉ cần chú ý học cú pháp và các tính năng kèm theo của nó. 

 

Chuỗi và mảng 

 

Tất cả route và controller nên trả về một response để cấp cho trình duyệt người dùng. Laravel hỗ trợ các bạn nhiều cách khác nhau để trả về response. Một response đơn giản nhất là trả về chuỗi từ route hoặc controller. Framework sẽ tự động chuyển chuỗi về HTTP response đầy đủ. Xem ví dụ sau:

 

Route::get('/', function() {
    return 'Home page';
});

 

Ngoài trả về chuỗi từ route hoặc controller, bạn có thể trả về một mảng. Framework sẽ tự động chuyển mảng về JSON response. Ví dụ: 

 

Route::get('/', function() {
    return [1, 2, 3];
});

 

Đối tượng dùng response 

 

Bạn sẽ không trả về các chuỗi hoặc chỉ có các mảng đơn trong ứng dụng. Bạn sẽ trả về lớp khởi tạo đầy đủ Illuminate\Http\Response hoặc view. Khi trả về lớp khởi tạo đầy đủ response sẽ giúp các bạn điều chỉnh mã trạng thái của HTTP response và header. Lớp response đó sẽ kế thừa từ class Symfony\Component\HttpFoundation\Response nên sẽ cung cấp nhiều method cho chuyện xây dựng HTTP response. Ví dụ: 

 

Route::get('home', function () {
    return response('Hello World', 200)
                ->header('Content-Type', 'text/plain');
});

 

Bạn đã thiết lập status code HTTP response là 200 thông qua tham số thứ nhì của method response. Ngoài ra, nó còn đính kèm header Content-Type: text/plain qua phương thức header kế tiếp.

 

Đính kèm header vào response 

 

Tất cả method response có thể kết nối cùng nhau và chúng cho phép bạn xây dựng bất cứ trường hợp response nào. Bạn có thể thêm nhiều header với method header trước khi trả về người dùng. Ví dụ: 

 

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

 

Thay vì phải mất nhiều thời gian để kết nối nhiều method, bạn dùng method with Headers để truyền được nhiều header dưới dạng mảng. Ví dụ: 

 

return response($content)
            ->withHeaders([
                'Content-Type' => $type,
                'X-Header-One' => 'Header Value',
                'X-Header-Two' => 'Header Value',
            ]);

 

Cache-control middleware 

 

Laravel có cung cấp cache.headers middle và cú pháp nhanh để thiết lập Cache-control header cho một nhóm route. Nếu etag đã được liệt kê trong cú pháp, hàm băm MD5 của response sẽ tự động thiết lập cho Etag identifier. Ví dụ: 

Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function() {
    Route::get('privacy', function () {
        // ...
    });

    Route::get('terms', function () {
        // ...
    });
});

 

Đính kèm cookie cho response 

 

Method cookie trên response object cho phép bạn đính kèm một cookie đến response nhanh chóng và thuận tiện. Ví dụ: 

 

return response($content)
                ->header('Content-Type', $type)
                ->cookie('name', 'value', $minutes);

 

Method cookie cũng có thể được nhận các tham số đặc biệt như setcookie của PHP. Ví dụ: 

 

->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

 

API là gì?

 

API (Application Programing Interface) là giao diện lập trình ứng dụng. Nó là giao diện để cho các ứng dụng và thường để thiết kế cho các hệ thống máy tính khác sử dụng. API khác với GUI. GUI là giao diện người dùng và được thiết kế chỉ cho người dùng. Các API hiện đại đều phải dựa trên HTTP và các bạn dùng nó để truy cập các ứng dụng web đã được triển khai cho các máy chủ. Các máy tính chủ đó phải truy cập mạng dựa trên Internet. 

 

 

Vậy là các bạn đã tìm hiểu HTTP response là gì. Đôi khi, các bạn làm việc rất nhiều với HTTP response nhưng không nhận ra. Có khi là làm nhiều ngày liên tục với phương phức này. Cho nên, các bạn nên tìm hiểu các khái niệm cơ bản và xoay quanh HTTP response. 

 

 

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Để lại bình luận