今天,我们将探讨 PHP 中的 cURL 扩展,它允许您从代码发出 HTTP 请求。
在日常 PHP 开发中,您经常需要与外部网站进行通信。无论是调用第三方 REST API 获取数据还是从外部网站下载资源,您都需要一个可以轻松完成的库。
在 PHP 中,您可以使用不同的方法来连接不同类型的服务器并进行通信。最简单的方法之一是使用 file_get_contents
函数读取远程文件。另一方面,也可以使用套接字来实现客户端与服务器的通信。不过,在本文中,我们将通过实际示例详细讨论 cURL 扩展。
cURL 代表客户端 URL,它是一个允许您使用 URL 语法发送和接收信息的库。事实上,它利用了 Daniel Stenberg 创建的 libcurl 库,该库允许您使用许多不同类型的协议连接到许多不同类型的服务器并与之通信。除了 HTTP 和 HTTPS 之外,libcurl 库还支持 FTP、Gopher、Telnet、DICT、File 和 LDAP 等协议。
从下一节开始,我们将通过几个实际示例来演示如何在 PHP 中使用 cURL 函数。
现实世界的例子
在本节中,我们将构建真实示例来演示 PHP 中的各种 cURL 函数。
如何在 PHP 中使用 cURL 下载文件
读取或下载远程文件是 cURL 最常见的用例之一。这是通过 cURL GET 请求完成的,我们将在本节中讨论该请求。
继续创建包含以下内容的 curl_read_file.php 文件。
<?php $url = 'https://www.example.com'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $data = curl_exec($curl); curl_close($curl);
在上面的示例中,我们使用 cURL 函数来读取 example.com 域的主页。让我们通过重要的片段来了解它是如何工作的。
首先,我们使用 curl_init
函数来初始化一个新的 cURL 会话。 $curlHandle
变量保存了一个 cURL 句柄,我们可以借助 curl_setopt
函数来设置 cURL 传输的各种选项。
当您使用 cURL 时,您最常使用的函数是 curl_setopt
函数,因为它允许您初始化各种 CURLOPT_*
请求选项。 curl_setopt
函数采用三个参数:cURL 句柄、CURLOPT_XXX
选项以及 CURLOPT_XXX
选项的值。
接下来,我们使用 CURLOPT_URL
选项通过 curl_setopt
函数将请求 URL 设置为 example.com
。此外,我们将 CURLOPT_RETURNTRANSFER
选项设置为 TRUE
,因为我们希望将响应初始化到 $responseData
变量中。如果我们不将其设置为 TRUE
,则响应将直接显示在屏幕上。最后,我们将 CURLOPT_HEADER
选项设置为 FALSE
以跳过输出中的标头信息。
最后,我们使用 curl_exec
函数来执行 cURL 请求。如果一切顺利,$responseData
变量应该包含 example.com
主页的源代码。
如何在 PHP 中使用 cURL 发布数据
在本节中,我们将了解如何使用 cURL 发布数据。
让我们创建包含以下内容的 curl_post_example.php 文件。
<?php $url = '{POST_REST_ENDPOINT}'; $curl = curl_init(); $fields = array( 'field_name_1' => 'Value 1', 'field_name_2' => 'Value 2', 'field_name_3' => 'Value 3' ); $fields_string = http_build_query($fields); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); $data = curl_exec($curl); curl_close($curl);
在上面的示例中,我们假设需要使用 HTTP POST 方法提交请求。事实上,它的工作原理与使用 POST 方法提交表单类似。
$fields
变量包含我们需要作为 POST 数据提交的值数组。接下来,我们使用 http_build_query
函数来准备 URL 编码的查询字符串。
接下来,我们将 CURLOPT_POST
选项设置为 TRUE
以将请求方法设置为 HTTP POST。此外,我们需要使用 CURLOPT_POSTFIELDS
选项来设置我们要随请求一起提交的 POST 数据。
最后,我们使用 curl_exec
函数来执行 cURL 请求。这样就可以发出cURL POST请求了。
如何在 PHP 中使用 cURL 发布 JSON 数据
通常,您需要在 cURL POST 请求中提交 JSON 数据。在本部分中,我们将了解如何在 cURL 请求中使用 POST 方法提交 JSON 数据。
由于这是一个 POST 请求,我们来修改一下上一节中讨论的示例。继续创建包含以下内容的 curl_post_json.php 文件。
<?php $url = '{POST_REST_ENDPOINT}'; $curl = curl_init(); $fields = array( 'field_name_1' => 'Value 1', 'field_name_2' => 'Value 2', 'field_name_3' => 'Value 3' ); $json_string = json_encode($fields); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true ); $data = curl_exec($curl); curl_close($curl);
尽管它看起来与上一节中的示例类似,但重要的是我们使用 json_encode
函数从 $fields
数组创建 JSON 字符串。
接下来,我们使用 CURLOPT_HTTPHEADER
选项将 Content-Type
标头设置为 application/json
以通知 API 服务器我们正在发送 JSON 数据。 Content-Type
标头对于以不同格式发布数据非常有用。例如,如果您想发送 XML 数据,则必须将 Content-Type
标头设置为 application/xml
。
除此之外,它与常规 POST 请求几乎相同。所以这样一来,就可以通过设置适当的 Content-Type
header 来发布不同类型的数据。如果您不设置 Content-Type
标头,它将使用 application/x-www-form-urlencoded
作为默认值。
如何在 PHP 中使用 cURL 上传文件
在本节中,我们将讨论如何使用 cURL 上传文件。
让我们创建包含以下内容的 curl_post_file.php 文件。
<?php $url = '{POST_REST_ENDPOINT}'; $curl = curl_init(); if (function_exists('curl_file_create')) { $fileAttachment = curl_file_create('/absolute/path/to/file/'); } else { $fileAttachment = '@' . realpath('/absolute/path/to/file/'); } $fields = array( 'field_name_1' => 'Value 1', 'field_name_2' => 'Value 2', 'field_name_3' => 'Value 3', 'uploaded_file' => $fileAttachment ); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $fields); curl_setopt($curl, CURLOPT_RETURNTRANSFER,1); $data = curl_exec($curl); curl_close($curl);
当你要上传文件时,你需要首先创建一个 CURLFile
对象。从 PHP 5.5+ 开始,创建它相当容易,因为您只需要使用 curl_file_create
函数来创建 CURLFile
对象。 curl_file_create
函数的第一个参数是要上传的文件的绝对路径。
如果您仍在使用较旧的 PHP 版本(不推荐),我们已使用后备 '@' 。 realpath('/absolute/path/to/file/')
语法创建文件链接。
最后,我们将 Content-Type
标头设置为 multipart/form-data
,因为它将是一个多部分表单 POST 请求。除此之外,这是一个例行的 cURL POST 请求。
到目前为止,我们已经了解了 PHP 中经常使用的几种不同的 cURL 方法。在下一节中,我们将了解如何使用 Guzzle 库,它使您在 PHP 中处理 HTTP 请求时变得更加轻松。
什么是 Guzzle HTTP 客户端?
根据官方文档:
Guzzle 是一个 PHP HTTP 客户端,可以轻松发送 HTTP 请求,并且可以轻松地与 Web 服务集成。
让我们快速了解一下使用 Guzzle 相对于 cURL PHP 函数的优势:
- 适用于不同类型数据的简单界面
- 支持同步和异步请求
- 支持 cURL、套接字和 PHP 流
- 符合 PSR-7
- 还有更多
总而言之,当您想使用不同的方法进行 HTTP 调用时,它是最好的库之一。在本节中,我们将讨论如何安装 Guzzle,然后通过几个快速示例来演示该库的强大功能!
如何安装 Guzzle 库
官方文档建议您使用Composer来安装Guzzle。让我们运行以下命令在您的项目中安装 Guzzle。
$composer require guzzlehttp/guzzle:^7.0 ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 6 installs, 0 updates, 0 removals - Installing psr/http-message (1.0.1): Loading from cache - Installing psr/http-client (1.0.1): Loading from cache - Installing ralouphie/getallheaders (3.0.3): Loading from cache - Installing guzzlehttp/psr7 (1.7.0): Loading from cache - Installing guzzlehttp/promises (1.4.1): Loading from cache - Installing guzzlehttp/guzzle (7.2.0): Loading from cache guzzlehttp/psr7 suggests installing laminas/laminas-httphandlerrunner (Emit PSR-7 responses) guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware) Writing lock file Generating autoload files
安装后,您需要使用 Composer 的自动加载器,如以下代码片段所示。
require 'vendor/autoload.php';
这样,您就可以使用 Guzzle 了!
如何使用 Guzzle 发出 GET 请求
在本节中,我们将了解如何使用 Guzzle 发送 GET 请求。
我们将修改之前讨论的示例,因为它将帮助您了解如何将现有的 cURL PHP 代码转换为基于 Guzzle 的实现。
让我们看一下修改后的示例。
<?php require 'vendor/autoload.php'; $client = new /GuzzleHttp/Client(); $response = $client->get('https://example.com'); $responseContents = $response->getBody();
是不是很简单呢?我们创建了 /GuzzleHttp/Client
类的实例,并将其分配给 $client
变量。现在,您可以访问 /GuzzleHttp/Client
类提供的大量实用方法。
在我们的例子中,我们需要使用 GET 方法获取内容,因此我们使用了 /GuzzleHttp/Client
类的 get
方法,它将返回 GuzzleHttp/Psr7/Response
对象。 GuzzleHttp/Psr7/Response
对象提供了各种方法,如 getStatusCode
、getBody
、getReasonPhrase
等。我们使用 getBody
方法来获取响应正文内容。
这就是您如何使用 Guzzle 执行 HTTP GET 请求。
如何使用 Guzzle 发出 POST 请求
在本节中,我们将了解如何使用 Guzzle 执行 HTTP POST 请求。
我们将修改我们在前面部分中讨论过的 curl_post_example.php 示例。使用 Guzzle 修改后的代码如下所示。
<?php require 'vendor/autoload.php'; $client = new /GuzzleHttp/Client(); $options = [ 'form_params' => [ "field_name_1" => "Value 1", "field_name_2" => "Value 2", "field_name_3" => "Value 3", ] ]; $response = $client->post("{POST_REST_ENDPOINT}", $options); $responseContents = $response->getBody(); ?>
由于这是一个 POST 请求,因此我们需要传递 $options
数组作为 post
方法的第二个参数。在我们的示例中,它包含我们需要作为 POST 数据提交的表单数据。
如果您想知道如何发送 JSON 数据,只需将 form_params
键更改为 json
,数据就会以 JSON 形式发送!
此外,如果您想随请求一起发送任何 HTTP 标头,您可以使用 headers
键来完成,如以下代码片段所示。
... ... $headers = array( 'Content-Type' => 'application/json' ); $options = [ 'form_params' => [ "field_name_1" => "Value 1", "field_name_2" => "Value 2", "field_name_3" => "Value 3", ], ‘headers’ => $headers ]; ... ...
事实上,Guzzle 库为每种方法提供了很多配置选项。此外,做同一件事有多种方法,所以我鼓励您详细探索它,我相信它会很有趣!
这是对 Guzzle 库以及 PHP cURL 函数的快速介绍。
结论
今天,我们探讨了 PHP 中 cURL 扩展的基础知识。我们讨论了如何在 PHP 中使用 cURL 执行不同类型的 HTTP 请求。此外,我们还快速介绍了 Guzzle 库,它使开发人员在 PHP 中处理 HTTP 请求时更加轻松。
以上就是PHP中使用cURL的方法的详细内容,更多请关注php中文网其它相关文章!