软件应用程序 cURL(Client for URLs)为开发人员提供了用于管理数据传输的强大工具包,有两种不同的模式运行:
- 用户友好的命令行界面,可满足基本交互的需要;
- 功能强大的库,旨在无缝集成到编程项目中。
curl_init()的定义
根据 PHP 官方网站,curl_init 函数初始化一个 cURL 会话,并返回一个 cURL 句柄,以便与 curl_setopt()、curl_exec() 和 curl_close() 函数一起使用。
涉及参数
URL
如果提供 URL, CURLOPT_URL
选项将设置为其值,还可以使用 curl_setopt()函数手动设置此选项。
但如果设置了 open_basedir
,则 cURL 本身会禁用 file
协议。
返回值
如果成功,curl_init() 函数会返回一个 cURL 句柄,如果出现错误,则返回 false
。
什么是 PUT 请求?
HTTP 中的 PUT 请求充当管理 Web 服务器上资源的精细工具,与对应的 GET 请求(用于数据检索)不同,专门针对服务器端的修改。
PUT 请求方法
与用于检索数据的 GET 请求不同,PUT 请求侧重于修改服务器端的信息,包含两个主要操作:
- 更新现有资源:如果某个资源(例如用户帐户或数据库中的产品)已存在于特定 URL,则可以使用 PUT 请求来更新其关联数据。
- 创建新资源:在指定 URL 不存在资源的情况下,可以使用 PUT 请求使用提供的数据创建新资源。
数据放置
PUT 请求通常在请求正文中传输数据,类似于 POST 请求。该数据通常表示目标资源的新状态或更新状态。
幂等性
PUT 请求的一个定义特征是其幂等性质,意味着使用相同的数据多次执行 PUT 请求将产生相同的结果。简单来说,使用相同的数据发送一次或多次 PUT 请求会在服务器上产生相同的结果。
PUT 请求的常见用例
- 更新用户配置文件或帐户信息
- 修改数据库中的现有内容(如修改文章内容等)
- 将新文件上传到服务器上的特定位置
curl_init() PUT 请求的代码示例
如果要了解如何使用 curl_init()
函数发出 PUT 请求,可以参考以下一些 PHP 编码示例:
示例 1:更新用户信息(JSON 数据)
使用 JSON 数据更新服务器上的用户个人资料信息:
<?php
$url = "https://www.example.com/api/users/123"; // Replace with actual user ID
$new_email = "new_email@example.com";
$data = array(
"email" => $new_email
);
$data_json = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // Set request method to PUT
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json); // Set PUT data as JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return the response
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json', // Set content type to JSON
'Authorization: Bearer YOUR_API_KEY' // Add authorization header
));
$response = curl_exec($ch);
curl_close($ch);
if($response) {
echo "User profile updated successfully!";
} else {
echo "Error: " . curl_error($ch);
}
?>
代码解读:
- 定义目标 URL(包括用户 ID)和新 email 地址。
- 创建一个包含更新后的 email 的
$data
数组,并使用json_encode
将其转换为 JSON。 - 初始化 curl 句柄并使用
CURLOPT_CUSTOMREQUEST
将请求方法设置为PUT。 - 使用
CURLOPT_POSTFIELDS
设置 PUT 数据,并将内容类型标头设置为 JSON。 - 使用 API 密钥添加授权 Header 以实现安全访问。
- 执行请求,关闭句柄,并检查是否有成功的响应。
示例2:上传文件(原始数据)
使用原始数据将文件上传到服务器:
<?php
$url = "https://www.example.com/api/uploads";
$filename = "myfile.txt";
$file_content = file_get_contents($filename); // Read file contents
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // Set request method to PUT
curl_setopt($ch, CURLOPT_PUT, 1); // Set PUT upload mode
curl_setopt($ch, CURLOPT_INFILE, fopen($filename, "rb")); // Set file for upload
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename)); // Set file size
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return the response
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/octet-stream' // Set content type for raw data
));
$response = curl_exec($ch);
curl_close($ch);
if($response) {
echo "File uploaded successfully!";
} else {
echo "Error: " . curl_error($ch);
}
?>
代码解读:
- 定义上传 URL 和文件名。
- 使用
file_get_contents
读取文件内容。 - 初始化 curl 句柄并将请求方法设置为PUT。
- 使用
CURLOPT_PUT
启用 PUT 上传模式。 - 使用
CURLOPT_INFILE
指定要上传的文件,并使用CURLOPT_INFILESIZE
指定文件大小。 - 设置内容类型标头来指示原始数据。
- 执行请求,关闭句柄,并检查是否有成功的响应。
示例3:使用 ETag 的条件 PUT
<?php
$url = "https://www.example.com/api/posts/123";
$new_title = "Updated Title";
$etag = "some-etag-value"; // Replace with actual ETag
$data = array(
"title" => $new_title
);
$data_json = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // Set request method to PUT
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json); // Set PUT data as JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return the response
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json', // Set content type to JSON
'If-Match: ' . $etag // Add ETag for conditional update
));
$response = curl_exec($ch);
curl_close($ch);
if($response) {
echo "Post updated successfully!";
} else {
$error = curl_error($ch);
if (strpos($error, '412 Precondition Failed') !== false) {
echo "Update failed: ETag mismatch (data may have been modified by another user).";
} else {
echo "Error: " . $error;
}
}
?>
代码解读:
- 定义目标 URL(帖子 ID)、新标题以及从服务器检索的 ETag。
- 创建一个
$data
数组并将其转换为 JSON。 - 将请求方法设置为 PUT 并包含 PUT 数据。
- 添加带有 ETag 的
If-Match
标头,以确保仅当当前服务器端版本与 ETag 匹配时才会发生更新,防止覆盖其他用户所做的更改(乐观锁定)。 - 检查响应是否成功并处理指示 ETag 不匹配的特定错误(412 Precondition Failed)。
注意事项
上面的代码示例不能直接复制粘贴到 IDE 中,因为这是经过简化的版本,需要进一步修改才能满足实际的应用程序使用需求。
自的 IDE 中进行所需的修改! 对于官方文档,可以查看:
用 Apifox 轻松使用 cURL 文件
Apifox 是一体化 API 开发平台,能够将 cURL 命令行转换为美观直观的图形显示,使开发人员更容易理解和使用 API。
不仅可以导入 cURL 命令,还可以对任何 API 进行构建、调试、模拟和记录,超级便利,Apifox 可以为我们提供不间断的工作流程。
快速将 cURL 命令导入 Apifox
要将 cURL 命令导入 Apifox,首先在项目中,单击 Apifox 窗口左上角的紫色 +
按钮,然后选择 导入 cURL
。
将 cURL 命令复制并粘贴到上显示的框中。
导入成功的话,就能够以 API 请求的形式查看 cURL 命令。
使用 Apifox 生成 PHP 代码
如果之前没有使用 PHP 编程语言进行编码的经验,也不要担心,Apifox 具有值得信赖的代码生成功能,提供多种其他编程语言的代码框架。
找到 API 请求上的 </> 生成代码
按钮,然后在下拉列表中选择 生成接口请求代码
。
接着在弹出的窗口中选择「PHP」,默认显示 cURL 部分,应该看到为 cURL 生成的代码。我们只需要将其复制并粘贴到 IDE(集成开发环境)就可以继续开发应用程序。
总结
通过使用 curl_init()
掌握 PUT 请求,不仅可以更新现有资源,还可以创建新资源。无论是管理用户配置文件、修改数据库条目还是上传文件,PUT 请求都可以提供精确且高效的数据操作方法。
curl_init()
提供了一种多功能方法,允许指定数据格式、设置用于安全通信的自定义标头,甚至处理大型文件传输的条件更新和进度报告等场景。curl_init() 函数还可以发送 POST 请求、GET 请求、DELETE 请求。借助这些新发现的知识,我们可以自信地利用 PUT 请求来提升 Web 应用程序的功能和性能。