Thủ tục
// set post fields
$post = [
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
];
$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
// execute!
$response = curl_exec($ch);
// close the connection, release resources used
curl_close($ch);
// do anything you want with your response
var_dump($response);
Hướng đối tượng
<?php
// mutatis mutandis
namespace MyApp\Http;
class CurlPost
{
private $url;
private $options;
/**
* @param string $url Request URL
* @param array $options cURL options
*/
public function __construct($url, array $options = [])
{
$this->url = $url;
$this->options = $options;
}
/**
* Get the response
* @return string
* @throws \RuntimeException On cURL error
*/
public function __invoke(array $post)
{
$ch = curl_init($this->url);
foreach ($this->options as $key => $val) {
curl_setopt($ch, $key, $val);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
$error = curl_error($ch);
$errno = curl_errno($ch);
if (is_resource($ch)) {
curl_close($ch);
}
if (0 !== $errno) {
throw new \RuntimeException($error, $errno);
}
return $response;
}
}
Sử dụng
// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');
try {
// execute the request
echo $curl([
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
]);
} catch (\RuntimeException $ex) {
// catch errors
die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}
Lưu ý bên ở đây: tốt nhất là tạo một loại giao diện được gọi là AdapterInterface
ví dụ với getResponse()
phương thức và để lớp bên trên thực hiện nó. Sau đó, bạn luôn có thể trao đổi việc thực hiện này với một bộ điều hợp khác mà bạn muốn, mà không có bất kỳ tác dụng phụ nào cho ứng dụng của bạn.
Sử dụng HTTPS / mã hóa lưu lượng
Thông thường có vấn đề với cURL trong PHP trong hệ điều hành Windows. Trong khi cố gắng kết nối với điểm cuối được bảo vệ https, bạn sẽ gặp lỗi cho bạn biết điều đó certificate verify failed
.
Điều mà hầu hết mọi người làm ở đây là nói với thư viện cURL chỉ cần bỏ qua các lỗi chứng chỉ và tiếp tục ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Vì điều này sẽ làm cho mã của bạn hoạt động, bạn giới thiệu lỗ hổng bảo mật khổng lồ và cho phép người dùng độc hại thực hiện các cuộc tấn công khác nhau trên ứng dụng của bạn như tấn công Man In The Middle hoặc như vậy.
Không bao giờ, bao giờ làm điều đó. Thay vào đó, bạn chỉ cần sửa đổi php.ini
và cho PHP biết CA Certificate
tệp của bạn ở đâu để cho phép xác minh chứng chỉ chính xác:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Bản mới nhất cacert.pem
có thể được tải xuống từ Internet hoặc trích xuất từ trình duyệt yêu thích của bạn . Khi thay đổi bất kỳ php.ini
cài đặt liên quan nào, hãy nhớ khởi động lại máy chủ web của bạn.
http_build_query()
để xử lý các tham số; Chỉ cần vượt qua các mảngCURLOPT_POSTFIELDS
là đủ.