HTTP Request Trong Laravel Là Gì?

HTTP Request Trong Laravel Là Gì?
Có thể bạn đã tìm hiểu qua về mô hình client-server, giao thức HTTP và nguyên lý hoạt động. Ở bài này, bạn hãy tìm hiểu thêm HTTP request trong Laravel là gì.

Ở bài trước, các bạn đã tìm hiểu qua HTTP response. Chúng ta sẽ tiếp tục tìm hiểu về HTTP request trong Laravel. Nắm vững được các request và response, các bạn có thể thiết kế và xây dựng web chuyên nghiệp. Điều này cũng hỗ trợ cho quá trình thực hiện các thao tác SEO cho website được tối ưu và hiệu quả tốt. 

 

Khái niệm HTTP request  trong laravel là gì?

 

HTTP request là thông tin được gửi từ khách hàng đến server để yêu cầu server đi tìm hoặc xử lý một số thông tin hoặc dữ liệu mà khách muốn. HTTP request có thể hiển thị dưới dạng một file text (XML hoặc JSON) mà đôi bên có thể hiểu nhau. 

 

HTTP request được xem như là thông báo yêu cầu HTTP. Thông tin sẽ được chuyển từ khách hàng đến server. Sau đó, server phải thực hiện thao tác theo yêu cầu. Ví dụ khi bạn truy cập vào một trang web, nó sẽ gửi request đến server để thực hiện mệnh lệnh. 

 

Trang web sẽ hiển thị kết quả sau khi nó đã thao tác xong. Khi nhấn submit form login, sẽ có một request hiện ra với thông tin username và password gửi đến server để kiểm tra dữ liệu đúng hay sai. 

 

Trong Laravel, class Illuminate\Http\Request cung cấp hướng đối tượng để tương tác với HTTP request từ khách để xử lý thông tin dễ dàng và các thao tác khác như truy xuất, cookie và file đã được gửi cùng với request. 

 

 

Cấu trúc của HTTP request 

 

Một HTTP request có cấu trúc 2 phần: 

 

  • Request line 
  • Body request (có hoặc không)

 

Request line 

 

Request line là dòng đầu tiên trong HTTP request. Request line có 3 phần: 

 

  • Phương thức HTTP được dùng
  • URI (Uniform Resource Identifier) hỗ trợ xác định các tài nguyên mà khách yêu cầu 
  • Phiên bản của giao thức HTTP

 

Request header 

 

Nhờ có request header, khách có thể gửi yêu cầu đến server. Mỗi lệnh sẽ kèm các thông số. Các thông số đó có tên chung là header parameters. Trình duyệt và server sẽ khác nhau tùy vào các thông số header để trả dữ liệu về và hiển thị dữ liệu phù hợp. Một số thông số phổ biến:

 

  • User-Agent: cho phép server xác định đúng ứng dụng, hệ điều hành, nhà cung cấp và phiên bản
  • Connection: kiểm soát kết nối mạng. Nó cho phép dừng hoặc tiếp tục kết nối sau khi server thực hiện xong yêu cầu
  • Cache-Control: chỉ định chính sách bộ nhớ đệm của trình duyệt
  • Accept-Language: cho biết tất cả các ngôn ngữ (tự nhiên) mà khách có thể hiểu 

 

Body request (request body) 

 

Body request cho phép khách gửi yêu cầu bổ sung cần thêm server sẽ thực hiện như thế nào. Ví dụ tạo mới hoặc cập nhật dữ liệu mà không thể truyền trên header parameters. Post, put và patch là 3 phương thức mà request body thường được dùng. 

 

Các phương thức hỗ trợ của HTTP request

 

Đối tượng tượng Illuminate\Http\Request cung cấp một số phương thức để bạn kiểm tra HTTP request và kế thừa từ class cơ sở là Symfony\Component\HttpFoundation\Request. 

 

$request->path();

 

Phương thức path trả về thông tin đường dẫn yêu cầu. Ví dụ đường dẫn https://hoclaravel.vn/category/laravel-co-ban thì phương thức path trả về là category/hoclaravel-co-ban.  

 

$uri = $request->path(); // trả về là echo $uri;

 

$request->is()

 

Phương thức is cho phép chúng ta kiểm tra đường dẫn yêu cầu có khớp với một mẫu. Sử dụng ký tự * để trùng khớp các chuỗi. 

 

if ($request->is('admin/*')) {
    // các đường dẫn bắt đầu bằng admin/ được xử lý

    // ví dụ http://hoclaravel/admin/product/create, http://hoclaravel/admin/news/create
}

if ($request->is('category/laravel-co-ban')) {
    echo 'Đường dẫn bạn vừa truy nhập đúng sẽ là http://hoclaravel/' . $request->path();
}

 

$request->url()

 

Phương thức này thường trả về đường dẫn đầy đủ của URL (không có query string. Query string là đoạn đằng sau dấu ? trong URL). Ví dụ https://hoclaravel/category/laravel-co-ban?page-3&lang=vn thì page=3&lang=vn là query string. Vai trò của query string là truyền giá trị giữa các trang web. 

 

// ví dụ đường dẫn https://hoclaravel/category/laravel-co-ban ?page=3&lang=vn
$url = $request->url();

// trả về https://hoclaravel/category/laravel-co-ban
echo $url;

 

$request->fullurl()

 

Phương thức này thường trả về đường dẫn URL đầy đủ và có query string. 

 

// ví dụ đường dẫn https://hoclaravel/category/laravel-co-ban?page=3&lang=vn
$full_url = $request->fullurl();

// trả về http://hoclaravel/category/laravel-co-ban?page=3&lang=vn
echo $full_url;

 

request−>method() và request->isMethod()

 

Phương thức này thường trả về cách thức yêu cầu gửi là GET hoặc POST. Các bạn có thể sử dụng phương thức isMethod để kiểm tra cách thức gửi yêu cầu. 

 

$method = $request->method();

if ($request->isMethod('post')) {
    echo 'POST request';
} else {
    echo 'GET request';
}

 

$request->route()->getName()

 

Ở phương thức này, nếu bạn đặt tên cho route thì nó sẽ trả về cho bạn tên của route đó. 

 

$request->server()

 

Vai trò của phương thức này là trả về các thông tin có liên quan đến máy chủ. Một số thông tin thông dụng: 

 

  • REQUEST_TIME: thời gian yêu cầu gửi đến máy chủ web
  • QUERY_STRING: query string trong URL
  • URL_REFERER: đường dẫn url tham chiếu
  • SERVER_ADDR: Địa chỉ máy chủ
  • REQUEST_SCHEME: giao thức sử dụng

 

Ví dụ: 

 

$serverAddress = $request->server('SERVER_ADDR');
echo "Địa chỉ IP máy chủ: . {$serverAddress}";

 

$request->header()

 

Phương thức này trả về các thông tin header của request dưới dạng mảng, bao gồm: thông tin về host yêu cầu, thông tin về trình duyệt có sử dụng user-agent, dữ liệu cookie,..Trong số các thông tin này, thông tin về trình duyệt user-agent thường được dùng nhiều nhất. 

 

$user_agent = $request->header('User-Agent');
echo $user_agent;

 

Form request là gì?

 

Form request là các class được tạo ra để chứa các mã nghiệp vụ kiểm tra dữ liệu và phân quyền với các HTTP request. 

 

Dùng câu lệnh artisan để tạo form request 

 

Các bạn có thể dùng câu lệnh artisan make:request để tạo các class form request:

 

php artisan make:request hoclaravel

 

Một class trong laravel sẽ được tạo ra và nó nằm ở thư mục app\Http\requests. Câu lệnh artisan có chức năng tạo thư mục tự động.

 

Dùng phương thức rules để kiểm tra dữ liệu 

 

Trong class form request thường có 2 phương thức có sẵn – authorize() và rules(). Phương thức rules() được dùng để kiểm tra dữ liệu được nhập vào từ HTTP request. 

 

/**
 * Get the validation rules that apply to the request.
 *
 * @return  array
 */
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publication_date' => 'date',
    ];
}

 

Làm thế nào dùng các rule đó để kiểm tra? Trong phương thức của controller, các bạn nên sử dụng type-hint của form request. Form request được dùng để validate trước khi phương thức trong controller được gọi. Do đó, các dòng code trong controller trật tự và không dễ bị nhầm lẫn với các logic kiểm tra. 

 

/**
 * Store the hoclaravel.
 *
 * @param    hoclaravel  $request
 * @return  Response
 */
public function store(hoclaravel $request)
{
    // The incoming request is valid...
}

 

Nếu chuyện kiểm tra dữ liệu gặp trục trặc, một response chuyển hướng được sinh ra và gửi ngược lại cho người dùng. Người dùng khi đó sẽ thấy các thông báo lỗi. Nếu request ở dạng AJAX thì một HTTP response với mã trạng thái 422 sẽ được trả về cùng lúc với dữ liệu dạng JSON có các lỗi phải kiểm tra. 

 

Xử lý công việc sau khi đã kiểm tra dữ liệu 

 

Nếu bạn muốn có những cách xử lý logic sau khi đã kiểm tra dữ liệu, thì bạn nên dùng hàm hook after trong form request với phương thức withValidator. Phương thức này nhận constructed validator và cho phép bạn gọi bất cứ phương thức nào của nó trước khi các validation rule được sử dụng. Xem ví dụ sau:

 

/**
 * Configure the validator instance.
 *
 * @param    \Illuminate\Validation\Validator  $validator
 * @return  void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

 

Mã logic phân quyền trong form request

 

Các class form request cũng có một phương thức authorize. Trong phương thức này, các bạn có thể kiểm tra một người dùng có thẩm quyền thực hiện công việc của controller này không. Hoặc bạn muốn xác định một người dùng có quyền truy cập nhận bình luận trong bài viết của bạn hay không? Xem ví dụ sau:

 

/**
 * Determine if the user is authorized to make this request.
 *
 * @return  bool
 */
public function authorize()
{
    $comment = Comment::find ($this->route('comment'));
    return $comment && $this->user()->can('update', $comment);
}

 

Nếu phương thức authorize trả về false, một HTTP request với mã trạng thái 403 sẽ được tự trả về. Phương thức trong controller sẽ không được thực hiện. Nếu bạn có kế hoạch thực hiện các logic phân quyền trong một phần khác của ứng dụng, bạn chỉ cần trả về true trong phương thức authorize. Ví dụ:

 

/**
 * Determine if the user is authorized to make this request.
 *
 * @return  bool
 */
public function authorize()
{
    return true;
}

 

Cách quản lý lỗi truy nhập vào tài nguyên không được phân quyền

 

Phương thức forbiddenResponse trong class form request được dùng để xử lý trong các tình huống người dùng truy cập vào một tài nguyên không được phân quyền. Ví dụ có một người dùng không thể sửa bình luận không thuộc của mình. 

 

Bình luận đó có id là 100 thì khi truy cập vào http://hoclaravel/comment/100, nó sẽ phát sinh một exception. Nếu muốn hiển thị bình luận đó thuộc về người dùng khác và thông báo người dùng không có quyền thực hiện bằng cách sử dụng phương thức forbiddenResponse(). Ví dụ: 

 

public function forbiddenResponse()
{
    return response()->view('errors.403');
}

 

Bạn cần tạo ra một view trong thư mục resources\views\errors có tên là 403.blade.php. Mỗi khi thực hiện một phương thức của controller có form request này, người dùng không được cấp phép thực hiện thì nó sẽ hiển thị view 403. Tương tự như vậy, nếu muốn giải quyết tình huống kiểm tra dữ liệu không qua được, bạn dùng phương thức response(). 

 

Một số thuộc tính phổ biến trong form request

 

Có một số thuộc tính phổ biến trong form request mà bạn có thể khai báo với nhiều mục đích khác nhau. 

 

  • $redirect: đường dẫn sẽ chuyển hướng nếu kiểm tra dữ liệu không thể qua được
  • $redirectRoute: route sẽ chuyển hướng nếu kiểm tra dữ liệu không thể qua được
  • $redirectAction: controller action sẽ chuyển hướng nếu kiểm tra dữ liệu không thể qua được
  • $dontFlash: các dữ liệu nhập trong các trường bạn không muốn flash trực tiếp (mặc định sẽ là ['password', 'password_confirmation'])

 

 

 

 

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/

Bình luận (0)