07/09/2018, 10:47

Hướng dẫn sử Dụng cURL để gửi HTTP request trong PHP

Giới Thiệu cURL là bộ thư viện được sử dụng để giúp thực hiện việc chuyển dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, FPT...). Với giao thức HTTP, cURL hỗ trợ việc gửi dữ liệu sử dụng tất cả các phương thức hiện có như GET, POST, PUT, DELETE... cURL cũng hỗ trợ việc chuyền dữ liệu sử ...

Giới Thiệu

cURL là bộ thư viện được sử dụng để giúp thực hiện việc chuyển dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, FPT...). Với giao thức HTTP, cURL hỗ trợ việc gửi dữ liệu sử dụng tất cả các phương thức hiện có như GET, POST, PUT, DELETE... cURL cũng hỗ trợ việc chuyền dữ liệu sử dụng giao thức HTTPS. Ngoài ra, chúng ta cũng có thể thực hiện việc xác thực request gửi đi thông qua cURL. Việc xác thực có thể được thực hiện thông qua việc thiết lập header cho request hoặc sử dụng cookies...

Trong bài viết này chúng ta sẽ tìm hiểu cURL được sử dụng trong ngôn ngữ PHP như thế nào.

Lưu ý: Nếu bạn sử dụng Linux thì sau khi đọc bài viết này bạn có thể tham khảo thêm bài viết sử dụng curl trên cửa sổ dòng lệnh để biết cách sử dụng câu lệnh curl trên terminal của Linux.

Yêu Cầu

Để sử dụng cURL trong PHP thì trên hệ thống chúng ta cần cài đặt bộ thư viện libcurl của PHP. Hầu hết các package cài đặt PHP như XAMP, WAMP hay MAMP đều tích hợp sẵn thư viện này.

Nếu bạn sử dụng Linux và thực hiện việc cài đặt PHP thủ công thì trong trường hợp libcurl chưa được cài đặt thì bạn có thể tiến hành việc cài đặt thư viện này sử dụng câu lệnh sau đây (bạn có thể cần thay thế php5-curl bằng tên package tương ứng với phiên bản PHP trên máy):

$ sudo apt-get install php5-curl

Sau đó khởi động lại Apache web server (nếu bạn chạy PHP cùng với Apache):

$ sudo /etc/init.d/apache2 restart

Cú Pháp Cơ Bản

Sau khi cài đặt libcurl bạn tạo một file test_curl.php với nội dung như sau:

<?php
    //** Bước 1: Khởi tạo request
    $ch = curl_init(); 

    //** Bước 2: Thiết lập các tuỳ chọn
    // Thiết lập URL trong request
    curl_setopt($ch, CURLOPT_URL, "codehub.vn"); 

    // Thiết lập để trả về dữ liệu request thay vì hiển thị dữ liệu ra màn hình
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    // ** Bước 3: thực hiện việc gửi request
    $output = curl_exec($ch); 
    echo $output; // hiển thị nội dung

    // ** Bước 4 (tuỳ chọn): Đóng request để giải phóng tài nguyên trên hệ thống
    curl_close($ch);
?>

Ở đây bạn cần lưu ý việc sử dụng libcurl thông qua bốn bước cơ bản:

  • Bước 1: Khởi tạo request sử dụng hàm curl_init(). Hàm này sẽ trả về một resource. Đây là một trong những kiểu dữ liệu được định nghĩa trong PHP. Kiểu dữ liệu resource cũng xuất hiện trong trường hợp khi bạn mở file (sử dụng fopen()) hay như khi bạn tạo kết nối tới database...
  • Bước 2: Thiết lập tuỳ chọn cho request sử dụng hàm curl_opt() . Hàm này được dùng để thiết lập các tuỳ chọn cho request URL hoặc các giá trị trong request header như content-type, charset hay phương thức HTTP, giá trịcookies... Mặc định thì request sẽ được gửi đi
  • Bước 3: Thực hiện việc gửi request sử dụng hàm curl_exec(). Trường hợp ở bước 2 nếu bạn thiết lập cho request trả về dữ liệu sử dụng curl_setop($ch, CURLOPT_RETURNTRANSFER, 1) thì giá trị trả về của curl_exec() sẽ là một chuỗi trong trường hợp thành công và false nếu thất bại. Ngược lại giá trị trả về sẽ là true nếu thành công và false nếu thất bại.
  • Bước 4 (tuỳ chọn): Đóng request sử dụng hàm curl_close(). Nếu không tạo các request tiếp theo thì bạn nên gọi hàm này để tiết kiệm tài nguyên trên hệ thống.

Thiết Lập Tuỳ Chọn cho Request

Ngoài hàm curl_setopt() thì curl_setopt_array() cũng được sử dụng để thiết lập tuỳ chọn cho request. Nếu bạn cần thiết lập nhiều tuỳ chọn khác nhau thì bạn nên sử dụng curl_setop_array().

Như ví dụ trên, sử dụng curl_setop_array() thay vì curl_setopt đoạn code sẽ trông gọn gàng hơn như sau:

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://codehub.vn'
));
...

Một số trường hợp giá trị của tuỳ chọn CURLOPT_URL còn có thể được thiết lập ngay trong curl_init():

$curl = curl_init('http://codehub.vn');

Để thiết lập phương thức HTTP nào được sử dụng bạn thiết lập giá trị cho các tuỳ chọn:

  • CURLOPT_CUSTOMREQUEST với một trong các giá trị POST, PUT, DELETE... tương ứng với các phương thức HTTP sử dụng.
  • CURLOPT_POST với giá trị là truenếu bạn muốn sử dụng phương thức POST và dưới kiểu dữ liệu gửi đi theo dạng application/x-www-form-urlencoded (tương tự như sử dụng form thông thường). Khi CUROPT_POST được gán giá trị là true bạn sẽ thường cần thiết lập thêm giá trị cho tuỳ chọn CURLOPT_POSTFIELDS để gán dữ liệu gửi đi. Trường hợp bạn muốn gửi dữ liệu kiểu multipart/form-data(ví dụ như upload file) bạn cần thiết lập giá trị cho tuỳ chọn CURLOPT_CUSTOMREQUEST.
  • CURLOPT_HTTPGET với giá trị là true nếu bạn muốn sử dụng phương thức GET. Do GET là phương thức mặc định nên bạn có thể bỏ qua thiết lập này.

Ví dụ sau đây sẽ gửi POST request với dữ liệu tương tự như khi dùng form:

    $data = array("username" => "test_user", "password" => "abcdabcd");
    $ch = curl_init("http://codehub.vn/login");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

    $output = curl_exec($ch);

Ở trên khi thiết lập giá trị cho tuỳ chọn CURLOPT_POSTFIELDS chúng ta sử dụng hàm http_build_query() để build dữ liệu cho các trường dữ liệu username và password trước khi gửi đi. Nếu không sử dụng hàm này bạn sẽ cần truyền vào kiểu dữ liệu chuỗi như sau:

    $ch = curl_init("http://codehub.vn/login");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=test_user&password=abcdabcd");

    $output = curl_exec($ch);

Lưu ý: Nếu bạn thiết lập giá trị cho tuỳ chọn CURLOPT_POSTFIELDS là một mảng array thì khi đó dữ liệu gửi đi sẽ là multipart/form-data thay vì application/x-www-form-urlencoded. Mặc dù việc gửi dữ liệu dưới dạng multipart/form-data vẫn có thể được thực hiện sử dụng tuỳ chọn CURLOPT_POST với giá trị là true, tuy nhiên PHP kiến nghị việc này nên được thực hiện sử dụng tuỳ chọn CURLOPT_CUSTOMREQUEST.

0