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ử 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ụngfopen()
) 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ụngcurl_setop($ch, CURLOPT_RETURNTRANSFER, 1)
thì giá trị trả về củacurl_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àtrue
nếu bạn muốn sử dụng phương thứcPOST
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). KhiCUROPT_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ọnCURLOPT_POSTFIELDS
để gán dữ liệu gửi đi. Trường hợp bạn muốn gửi dữ liệu kiểumultipart/form-data
(ví dụ như upload file) bạn cần thiết lập giá trị cho tuỳ chọnCURLOPT_CUSTOMREQUEST
.CURLOPT_HTTPGET
với giá trị làtrue
nếu bạn muốn sử dụng phương thứcGET
. DoGET
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
.
Mình hiểu như thế này đúng hay sai mong admin có thể hỗ trợ:
Các dòng:
Đều là dữ liệu và phương thức truyền vào.
Còn
$output = curl_exec($ch);
là dữ liệu ta lấy được từ trang webhttp://codehub.vn/login
truyền ra.Biến
$output
chứa nội dung lấy về từ việc gửi request tới trang login.Nếu web page đích có nhiều form, như vừa có form login, vừa có form đăng ký. Vậy mình có thể chọn form để CURL ko bạn?
Bài viết tự viết khác hẳn các bài viết copy nhau ở mấy web khác. Cảm ơn tác giả bài viết nhiều. <Đã like>