下面是详细讲解”phpcurl获取https请求的2种方法”的攻略:
什么是curl
cURL(Client URL)是一个用于命令行下工作的,可以使用URL语法来传输文件和数据的工具,被广泛应用于传输文件下载、API调用等场景。PHP有自己的CURL库,我们可以通过它来进行一些网络请求操作。
什么是https
HTTPS (Hypertext Transfer Protocol Secure) 本质上是在传输层(TLS/SSL)提供了可靠的端到端加密功能,确保数据传输过程中安全性和完整性。
当数据进行网络传输时,https会为数据加上HTTP和安全套接字层(SSL)或传输层安全协议(TLS)协议,即HTTPS,来确保数据传输的安全。其中,SSL协议是HTTPS中最为核心的安全技术之一,主要功能在于为浏览器和服务器之间的网络连接加密。
curl获取https请求
当我们使用https协议进行请求时,需要注意以下几点:
- 需要开启curl扩展中的openssl支持
- 需要将请求的url中的http://替换成https://
此外,我们获取https请求主要需要访问服务器证书,有两种方式可以实现。
方式一:关闭SSL验证
由于cURL在请求https时,默认会验证对方的证书,当请求不被信任时,会抛出”SSL certificate problem: unable to get local issuer certificate”这样的错误。此时,我们可以通过关闭证书验证取消检验来解决该问题。
$url = "https://www.example.com/";
$ch = curl_init();
//关闭SSL验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $result;
从代码中可以看出,我们首先设置了请求的url、采用的请求选项,同时关闭了SSL证书验证,当请求返回数据时,直接输出即可。值得注意的是,关闭ssl证书验证无异于废掉了https的一项屏障,因此此时我们需要自主考虑请求的安全问题。
方式二:设置证书文件
我们可以通过cURL提供的参数CURLOPT_CAINFO来指定需要验证的证书列表,也就是说,将SSL证书转换为root-ca.pem格式,然后指定该文件作为HTTPS请求所能够信任的证书列表即可。
在此基础上,我们可以采用下方的代码来获取https请求。
$url = "https://www.example.com/";
$ch = curl_init();
// 设置证书文件
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $result;
在上面的代码中,我们首先指定了证书文件路径,同时采用了curl_setopt函数设置了HTTPS的安全选项。值得注意的是,此处我们需要自己手动指定root-ca.pem文件,并将其设置为执行文件所在的根目录下。
示例说明
- 示例1
假设我们需要将一个绝对路径的文件上传到指定的https地址:https://www.example.com/upload.php,我们可以采用如下方式:
$url = "https://www.example.com/upload.php";
$file_path = '/data/test.text';
$ch = curl_init();
$file = new CURLFile($file_path);
$data = array('file' => $file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 通过证书文件验证https连接
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$output = curl_exec($ch);
if (curl_errno($ch)) {
echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $output;
上面的代码中,我们向一个https地址http://www.example.com/upload.php提交了一个文件。其中,需要注意的是,我们在设置请求方式时采用了curl_setopt($ch, CURLOPT_POST, 1),而非上方方式中的curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1),这是因为我们需要采用POST方式进行上传文件。
此外,为了验证https连接,我们也在代码中加入了curl_setopt函数进行设置。
- 示例2
假设我们需要向目标服务器发送一个GET请求,并获取返回数据,我们可以采用以下代码:
$url = "https://www.example.com/getdata.php?key1=value1&key2=value2";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 通过证书文件验证https连接
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$output = curl_exec($ch);
if (curl_errno($ch)) {
echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $output;
从上面的代码中可以看出,我们通过设置请求的url,并通过curl_setopt函数定义请求的方式,最后获取到请求返回的数据。
需要注意的是,在此处,我们同样需要定义curl_setopt函数来验证https连接。