使用 PHP发送curl GET 请求

1 min read

curl 是一个命令行工具和库,用于通过 URL 传输数据。 在 Web 开发环境中,curl 允许用户直接从命令行或通过脚本发出请求并与各种互联网资源(例如网站和 API)进行交互。

curl 支持多种协议,包括 HTTP、HTTPS、FTP 和 FTPS,这使得它对于文件传输、数据检索和 API 集成等任务通用性。 curl 处理复杂操作和发送不同类型请求的能力使其成为不可或缺的工具,实现应用程序和远程服务器之间的无缝通信。 它的灵活性和易用性使其成为现代 Web 开发工作流程的基本组成部分。

GET 请求是 Web 通信中的重要组成部分,旨在从 Web 服务器上的指定资源检索信息或数据。 在本教程中,您将学习如何使用curl 通过 PHP 发出 GET 请求。

什么是 GET 请求

GET 请求是一种 HTTP 方法,旨在从 Web 服务器上的指定资源检索信息或数据。 例如,当您在网络浏览器中输入 URL 并按 Enter 键时,您将触发 GET 请求。 浏览器向服务器发出 GET 请求并返回浏览器中显示的网页。

GET 请求的目的是向服务器请求特定资源,无论是 HTML 页面、图像、文档,甚至是来自 API 的数据。 GET请求的简单性在于它的方法; 这是一个幂等操作/idempotent operation,这意味着它不应该改变服务器的状态或所请求的资源。 GET 请求是只读的,通常不涉及发送数据或对服务器进行更改; 其主要功能是数据检索。

GET 请求还支持将键值对(称为查询参数)附加到 URL。 查询参数允许您准确指定您想要的内容。 例如,当您在搜索引擎上搜索某些内容时,您输入的查询将作为 GET 请求中的一系列参数传递到搜索引擎的服务器。 服务器处理这些参数,检索相关搜索结果,并将它们作为响应发回,然后显示在您的 Web 浏览器中。

需要注意的是,由于 GET 请求会公开 URL 中的数据,因此它们不适合发送敏感或机密信息,因为任何可以查看 URL 的人都可以看到参数。

在 PHP 中使用curl 实现 GET 请求

在本节中,您将了解如何初始化curl会话、设置URL和其他特定选项、设置特定参数、向远程资源发送请求以及处理PHP应用程序中的响应。

前提是,您需要确保您的 PHP 版本具有curl 支持。 大多数现代 PHP 安装都默认启用了 curl,可先验证一下:您可以使用 phpinfo() 函数确认您的 PHP 版本和配置。 为此,请创建一个名为 php-curl 的文件夹,并在其中创建一个名为 info.php 的文件。 将以下代码粘贴到文件中:

<?php
phpinfo();

在终端中,执行命令 php -S localhost:8000 并在浏览器中导航到http://localhost:8000/info.php,在生成的网页上,向下滚动到“curl”部分并确认已启用“curl”支持:

一旦确认启用了curl,并且在初始化curl会话之前,您需要在项目根文件夹中创建一个名为curl.php的新文件。 然后将以下代码添加到新的curl.php 文件中:

<?php
$ch = curl_init();

这将使用curl_init()函数启动一个curl会话。 该函数初始化一个新的curl会话并返回一个curl handle instance,这是使用curl进行进一步操作的关键工具,例如设置选项和发送请求。

设置 URL 和其他选项

配置curl选项(包括设置URL)是在PHP中使用curl发出HTTP请求的关键部分。 它建立了 HTTP 请求的基础,确定目标服务器、发出的请求类型(GET、POST 等)以及任何必要的身份验证或参数。

PHP 提供了curl_setopt() 函数,可以轻松设置curl 会话句柄的各种选项,并且允许您通过指定不同的参数和值来自定义curl 请求的行为。

curl_setopt() 函数采用以下形式:curl_setopt(CurlHandle $handle, int $option, mix $value)。 $handlecurl_init()函数返回的句柄,$option代表你想要设置的具体选项,$value代表你想要给指定选项设置的值。

要设置 URL,请将以下代码添加到curl.php 文件中:

$url = "https://dummyjson.com/products";
curl_setopt($ch, CURLOPT_URL, $url);

此代码使用curl_setopt()函数来设置curl会话句柄的URL选项。 CURLOPT_URL 是一个常量,表示为curl 请求设置URL 的选项。

现在,让我们研究一下您可以配置的其他选项。

要设置curl选项以获得更受控制的HTTP请求体验,请将以下代码添加到curl.php文件中:

// Set a timeout for the cURL request
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// return the response from the server as a string instead of outputting it directly
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// avoid following redirects, if any
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

在此代码中,CURLOPT_TIMEOUT 配置值为30,定义了 curl 请求的最大执行时间为 30 秒。 这确保了如果请求时间超过三十秒,它将超时,从而防止长时间等待。

CURLOPT_RETURNTRANSFER 设置为 true,指示curl 将服务器的响应作为字符串返回,而不是直接显示。 这允许您在 PHP 脚本中捕获和操作响应数据。

最后,CURLOPT_FOLLOWLOCATION 设置为 false,表示curl 不应自动遵循 HTTP 重定向。 通过禁用自动重定向,脚本保留对请求流的控制,从而允许自定义处理重定向响应。

您可以在PHP 文档中找到有关可配置的其他选项的更多信息。

执行 GET 请求

要执行请求并查看响应,请将以下代码添加到curl.php文件中:

// Execute the cURL request and capture the response
$response = curl_exec($ch);
// Check for cURL errors
if (curl_errno($ch)) {
   echo 'Curl error: ' . curl_error($ch);
} else {
   // Decode JSON response if it is a JSON string
   $decodedResponse = json_decode($response, true);
   // Check if decoding was successful
   if ($decodedResponse !== null) {
       // Output the JSON response to the UI
       header('Content-Type: application/json');
       echo json_encode($decodedResponse, JSON_PRETTY_PRINT);
   } else {
       // If the response is not valid JSON, echo it as plain text
       echo $response;
   }
}
// Close cURL session
curl_close($ch);

然后在浏览器上导航到 http://localhost:8000/curl.php,加载页面时,您应该会获得 JSON 格式的产品数组:

发送带参数的GET请求

要在 URL 中指定参数,请在 $url = “https://dummyjson.com/products”,如下:

// Query parameters
$params = [
   'limit' => 2
];

// Construct the complete URL with query parameters
$url .= '?' . http_build_query($params);

在此代码中,您将 “https://dummyjson.com/products” 定义为URL。 然后,在名为 $params 的关联数组中定义一个名为 limit 的查询参数,其值为 2。 要将此参数合并到 URL中,请使用 http_build_query($params) 函数,该函数将关联数组转换为URL编码的查询字符串。 生成的查询字符串使用问号连接到原始 URL,从而使用指定的查询参数创建完整的 URL。 生成的 URL 如下所示:”https://dummyjson.com/products?limit=2“。

要对此进行测试,请在浏览器上导航至http://localhost:8000/curl.php并重新加载页面。 您应该得到一个只有两个JSON格式产品的数组:

总结

在本文中,您学习了如何在 PHP 中使用curl 发出GET请求。 了解 GET 请求的基本原理是简化数据交换的基础。

使用各种curl选项,开发人员可以自定义他们的GET请求,确保精确控制超时、管理重定向以及接收字符串形式的响应以进行进一步操作。 这种灵活性使开发人员可以微调与 Web 服务器的交互,并确保高效且定制的数据检索。

要了解有关使用curl的更多信息,请查看在Python使用curl指南和如何在代理网络中使用curl指南。