Giới thiệu
cURL là một thư viện mạnh mẽ trong PHP cho phép thực hiện các yêu cầu HTTP và FTP một cách dễ dàng và hiệu quả. Mặc dù cURL rất mạnh mẽ, nhưng tài liệu chính thức có thể khó hiểu đối với nhiều lập trình viên. Trong bài viết này, chúng tôi sẽ cung cấp một cheat sheet về cURL trong PHP, bao gồm các ví dụ cụ thể và những thực tiễn tốt nhất để bạn có thể sử dụng cURL hiệu quả hơn.
Mục lục
- Tổng quan về cURL
- Yêu cầu GET cơ bản
- Tái sử dụng con trỏ cURL cho nhiều yêu cầu
- Xây dựng và gửi chuỗi truy vấn
- Lấy mã HTTP với
curl_getinfo - Kết nối đến cổng khác
- Xử lý lỗi
- Gửi tiêu đề
- Nhận tiêu đề
- Xác thực cơ bản
- Gửi và nhận cookie
- Jars cookie
- Gửi yêu cầu POST
- Gửi JSON qua POST
- Gửi dữ liệu form qua POST
- Gửi PUT, PATCH và DELETE
- Tải xuống tệp
- Tải lên tệp
- Sử dụng FTP
- Thực tiễn tốt nhất
- Câu hỏi thường gặp
Tổng quan về cURL
Một kịch bản cURL thường bao gồm bốn giai đoạn cơ bản:
- Khởi tạo: Tạo handle cURL bằng
curl_init(). - Cài đặt tùy chọn: Sử dụng
curl_setopt()để thiết lập tất cả các tùy chọn cho yêu cầu như tiêu đề và dữ liệu body. - Thực thi: Chạy yêu cầu cURL với
curl_exec()và, nếu cần, lấy dữ liệu phản hồi. - Đóng: Đóng handle đã tạo bằng
curl_init().
Yêu cầu GET cơ bản
Yêu cầu HTTP GET cơ bản rất đơn giản. Chúng ta khởi tạo cURL bằng curl_init() với URL làm tham số và thiết lập tùy chọn CURLOPT_RETURNTRANSFER là true để nhận được body phản hồi.
php
$url = "http://example.ca/api/bands";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
Chúng ta cũng có thể chỉ định URL bằng tùy chọn CURLOPT_URL thay vì làm tham số cho curl_init().
php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
Tái sử dụng con trỏ cURL cho nhiều yêu cầu
Chúng ta có thể tái sử dụng một handle cURL để thực hiện nhiều yêu cầu bằng cách thay đổi URL với tùy chọn CURLOPT_URL và chạy lại curl_exec(). Dưới đây là ví dụ về cách thực hiện hai yêu cầu GET đến hai URL khác nhau.
php
$url_bands = "http://example.ca/api/bands";
$url_albums = "http://example.ca/api/albums";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Thực hiện yêu cầu đầu tiên
curl_setopt($ch, CURLOPT_URL, $url_bands);
$result_bands = curl_exec($ch);
// Thực hiện yêu cầu thứ hai
curl_setopt($ch, CURLOPT_URL, $url_albums);
$result_albums = curl_exec($ch);
curl_close($ch);
Xây dựng và gửi chuỗi truy vấn
Gửi chuỗi truy vấn rất đơn giản: chỉ cần thêm nó vào URL của yêu cầu.
php
$url = "http://example.ca/api/bands?name=bratmobile";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
Để xây dựng chuỗi truy vấn từ mảng, chúng ta có thể sử dụng hàm http_build_query.
php
$args = [
'artist' => 'monk, thelonious',
'years' => [1957, 1963],
];
$query_string = http_build_query($args);
$url = "http://example.ca/api/bands?" . $query_string;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
Lấy mã HTTP với curl_getinfo
Mã phản hồi HTTP có thể được lấy từ handle cURL bằng curl_getinfo() như sau:
php
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
Kết nối đến cổng khác
Cổng có thể được thiết lập với tùy chọn CURLOPT_PORT.
php
curl_setopt($ch, CURLOPT_PORT, 8080);
Xử lý lỗi
cURL có thể gặp lỗi; nên kiểm tra và xử lý chúng là rất quan trọng.
php
if(curl_errno($ch)) {
$error_message = curl_error($ch);
// xử lý lỗi
}
Xử lý lỗi HTTP
Mặc định, các lỗi HTTP không được coi là lỗi cURL. Chúng ta có thể thay đổi điều này bằng cách thiết lập CURLOPT_FAILONERROR thành true.
php
curl_setopt($ch, CURLOPT_FAILONERROR, true);
Gửi tiêu đề
Tiêu đề có thể được thiết lập với tùy chọn CURLOPT_HTTPHEADER.
php
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-My-Special-Header: foo',
]);
Nhận tiêu đề
Chúng ta có thể nhận tiêu đề phản hồi bằng cách sử dụng CURLINFO_HEADER_SIZE để trích xuất chúng từ phản hồi.
php
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headersString = substr($result, 0, $headerSize);
Xác thực cơ bản
Để thực hiện yêu cầu đến các trang web được bảo vệ bằng xác thực cơ bản, sử dụng CURLOPT_HTTPAUTH và CURLOPT_USERPWD.
php
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "<username>:<password>");
Gửi và nhận cookie
Chúng ta có thể gửi cookie dưới dạng chuỗi hoặc bằng tiêu đề.
php
curl_setopt($ch, CURLOPT_COOKIE, "favourite_year=1993;preferred_format=EP");
Jars cookie
Để lưu trữ cookie giữa các yêu cầu, chúng ta có thể sử dụng tính năng cookie jar.
php
curl_setopt($ch, CURLOPT_COOKIEJAR, "/path/to/cookiejar");
Gửi yêu cầu POST
Chúng ta có thể thiết lập phương thức HTTP là POST bằng cách sử dụng CURLOPT_POST hoặc CURLOPT_CUSTOMREQUEST.
php
curl_setopt($ch, CURLOPT_POST, true);
Gửi JSON qua POST
Gửi dữ liệu JSON qua POST bằng cách thiết lập CURLOPT_POSTFIELDS và tiêu đề Content-Type: application/json.
php
$data = ['name' => 'bratmobile'];
$json = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
Gửi dữ liệu form qua POST
Dữ liệu form có thể được gửi với CURLOPT_POSTFIELDS.
php
$args = ['artist' => 'monk, thelonious', 'years' => [1957, 1963]];
$postFields = http_build_query($args);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
Gửi PUT, PATCH và DELETE
Các phương thức PUT, PATCH và DELETE có thể được gửi bằng CURLOPT_CUSTOMREQUEST.
php
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
Tải xuống tệp
Để tải xuống tệp, chúng ta cần sử dụng con trỏ tệp được tạo bởi fopen().
php
$outputFp = fopen("/path/to/image.jpg", "wb");
curl_setopt($ch, CURLOPT_FILE, $outputFp);
Tải lên tệp
Để tải lên tệp, tạo đối tượng CURLFile và gán nó cho CURLOPT_POSTFIELDS.
php
$curlFile = new CURLFile($path, $mime, $postname);
curl_setopt($ch, CURLOPT_POSTFIELDS, [$curlFile->postname => $curlFile]);
Sử dụng FTP
PHP cung cấp một bộ lệnh FTP hữu ích mà bạn có thể xem xét sử dụng thay cho cURL.
php
$url = "ftp://ftp.example.ca";
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
Thực tiễn tốt nhất
- Luôn kiểm tra lỗi sau mỗi yêu cầu cURL.
- Sử dụng cookie jar để quản lý cookie giữa các yêu cầu.
- Sử dụng
CURLOPT_VERBOSEđể gỡ lỗi.
Câu hỏi thường gặp
cURL có an toàn không?
cURL là an toàn nếu được sử dụng đúng cách, hãy đảm bảo sử dụng HTTPS khi gửi thông tin nhạy cảm.
Tôi có thể sử dụng cURL để tải lên tệp không?
Có, bạn có thể sử dụng cURL để tải lên tệp bằng cách tạo đối tượng CURLFile và gửi nó qua POST.
Kết luận
Hy vọng cheat sheet này sẽ giúp bạn sử dụng cURL trong PHP một cách hiệu quả hơn. Đừng ngần ngại thử nghiệm và áp dụng các ví dụ trên vào dự án của bạn. Nếu bạn có thắc mắc hoặc cần thêm thông tin, hãy để lại câu hỏi trong phần bình luận bên dưới!