使用 PHP 客户端连接 techblik.com API 的指南
本指南将深入探讨如何使用不同的 PHP 客户端与 techblik.com API 进行通信。
我们将详细介绍如何利用 `file_get_contents` 函数、Guzzle、HTTPful 和 Symfony 等各种 HTTPS 客户端来访问 techblik.com API。
什么是 techblik.com API?
techblik.com 提供了一套免费的工具,用于监测网站性能。 这些工具包括死链检查器、页面加载时间和 DNS 检查器等,可通过网页界面或 API 在线访问。
该 API 基于 HTTP 协议,因此可以使用任何具备 HTTP 客户端库的编程语言进行访问。它提供了一个慷慨的免费层级,用户无需提供任何付款信息即可开始使用。
我们将会构建什么
我们将编写一个可从命令行执行的脚本。该脚本将计算加载 Google 网站所需的时间,并将结果打印在终端上。我们将使用不同的 PHP HTTP 客户端来实现这个简单程序,以演示如何使用 API。
具体来说,我们将使用 PHP 内置的 `file_get_contents()` 函数和 `php_curl`,以及 Guzzle PHP 扩展库。尽管这些示例可能看起来很简单,但它们涵盖了使用 techblik.com API 的核心概念。
先决条件
在继续学习之前,你需要具备一定的 PHP 编程知识,并且已经在你的计算机上安装了 PHP。此外,你还需要 Composer 来管理扩展库。
最后,你需要一个文本编辑器来编写代码。在本例中,我将使用 Visual Studio Code,一款来自微软的流行的开源文本编辑器。你可以从 Visual Studio Code 官网下载它。
techblik.com API 概述
techblik.com API 具有多个端点,具体取决于你要执行的操作。完整的端点列表及其相关文档可以在其官方文档页面上找到。
创建 techblik.com 账户
要开始使用 API,你需要前往 API 登录页面并点击注册按钮来创建一个账户。注册完成后,你会被带到仪表板,在那里你可以找到你的 API 密钥。仪表板的界面大致如下。出于安全考虑,我已经将我的 API 密钥模糊处理了。
在你的每一个 API 请求中,你都需要将此密钥作为请求头信息提供。稍后你将看到具体的操作方法。
完成 techblik.com 账户的创建和 PHP 的安装后,我们就可以开始创建项目了。
创建项目文件夹
首先,创建一个文件夹用于存放我们的项目文件。然后,在该文件夹内创建以下文件:
- .env
- with_curl.php
- with_file_get_contents.php
- with_guzzle.php
接下来,运行以下命令安装 `vlucas/phpdotenv` 和 `guzzlehttp/guzzle` 扩展库:
composer require vlucas/phpdotenv guzzlehttp/guzzle
此时,你的项目文件夹的结构应如下所示:
现在打开 `.env` 文件,并添加以下代码行,将 `<your-api-key>` 替换为你从 techblik.com 仪表板获得的实际 API 密钥:
API_KEY=<your-api-key>
使用 `file_get_contents()`
我们发出 HTTP 请求的第一种方法是使用 PHP 内置的 `file_get_contents()` 函数。 该函数的函数签名如下:
file_get_contents(path, include_path, context)
尽管此函数通常用于读取本地文件的内容,但我们也可以使用它来读取 Web 资源,例如 API 端点返回的数据。
首先,打开 `with_file_get_contents.php` 文件,并添加基本的 PHP 代码结构。
<?php // 所有代码将插入此处 ?>
接下来,我们可以开始加载所需的扩展库。将以下代码行添加到文件中:
require_once('vendor/autoload.php');
接着,我们可以加载环境变量,其中包含了我们的 API 密钥:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
然后,我们可以定义请求的载荷。这将是我们作为请求体发送的数据:
$payload = json_encode([ "url" => "https://www.google.com", "proxyCountry" => "us", "followRedirect" => true ]);
我们创建了一个 `$payload` 变量,并将其赋值为一个包含 `url`、`proxyCountry` 和 `followRedirect` 属性的 JSON 字符串。
`url` 属性指定了我们要检查加载时间的网页。
`proxyCountry` 是我们用来发起请求的服务器位置。 在此例中,我们使用美国服务器,但你也可以选择印度、中国、英国和法国。 你可以查阅文档了解更多信息。
`followRedirect` 属性指定代理服务器是否应该跟踪任何重定向,并测量最终响应或者第一次重定向的响应时间。
接下来,我们可以通过添加以下代码创建用于配置请求的选项:
$options = [ "http" => [ "method" => "POST", "header" => array("Content-Type: application/json", "x-api-key : " . $_ENV['API_KEY']), "content" => $payload ] ];
通过这段代码,我们创建了一个选项对象,指定 HTTP 方法为 `POST`,并且定义了两个头部属性:内容类型为 JSON,以及 `x-api-key`,其值来自于 `.env` 文件并已加载为环境变量。
接下来,我们可以通过创建一个数据流来发送请求,这个数据流将写入我们的选项配置:
$context = stream_context_create($options);
然后,我们调用 `file_get_contents()` 方法来发送请求,并将响应存储在一个变量中:
$response = file_get_contents("https://api.techblik.com.com/loadtime", false, $context);
我们向 `https://api.techblik.com.com/loadtime` 发送了请求。 `false` 参数告诉 PHP 不要使用该路径。我们将之前创建的上下文传递给该方法。
为了显示响应,我们将使用以下输出代码:
echo "Loadtime: " . json_decode($response)->data->total . "n";
最后,你的文件应该看起来像这样:
<?php require_once('vendor/autoload.php'); $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $payload = json_encode([ "url" => "https://www.google.com", "proxyCountry" => "us", "followRedirect" => true ]); $options = [ "http" => [ "method" => "POST", "header" => array("Content-Type: application/json", "x-api-key : " . $_ENV['API_KEY']), "content" => $payload ] ]; $context = stream_context_create($options); $response = file_get_contents("https://api.techblik.com.com/loadtime", false, $context); echo "Loadtime: " . json_decode($response)->data->total . "n"; ?>
当你使用以下命令运行该文件时:
php with_file_get_contents.php
你将得到以下输出:
Loadtime: 81
使用 cURL
cURL 是一个命令行工具,用于发送客户端 URL 请求。在 PHP 中,我们可以使用 `php-curl` 扩展库来使用它。要开始使用,请打开 `with_curl.php` 文件,并编写基本的 PHP 代码结构:
<?php // 所有新代码都将写在这里 ?>
然后,我们导入扩展库并加载在 `.env` 文件中定义的 `API_KEY` 环境变量:
require_once('vendor/autoload.php'); $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
接下来,我们将创建一个变量,用于将头部信息以数组的形式存储,其中数组中的每个元素都是一个特定的头部信息:
$header = ["Content-type: application/json", "x-api-key: " . $_ENV['API_KEY']];
我们定义了两个头部信息:一个用于内容类型,另一个用于 API 密钥。
然后,我们可以定义请求的主体:
$body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]);
接下来,我们可以使用 `curl_init()` 函数创建一个 cURL 会话。我们将要发出请求的 URL 作为参数传递给该函数:
$ch = curl_init("https://api.techblik.com.com/loadtime");
现在,我们可以通过将头部信息和请求主体定义为会话的选项来将所有内容放在一起。为此,我们将使用 `curl_setopt_array()` 函数:
curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => $header, CURLOPT_POSTFIELDS => $body ]);
要发送请求,我们将调用 `curl_exec()` 函数:
$response = curl_exec($ch);
我们已将响应存储在 `$response` 变量中,因此我们可以关闭会话以释放会话正在使用的系统资源:
curl_close($ch);
最后,我们可以使用 `var_dump` 将响应打印到屏幕上:
var_dump($response);
最后,你的脚本文件应该如下所示:
<?php require_once('vendor/autoload.php'); $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $header = ["Content-type: application/json", "x-api-key: " . $_ENV['API_KEY']]; $body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]); $ch = curl_init("https://api.techblik.com.com/loadtime"); curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => $header, CURLOPT_POSTFIELDS => $body ]); $response = curl_exec($ch); curl_close($ch); var_dump($response); ?>
当我们使用 `php with_curl.php` 运行脚本时,你应该得到以下输出:
{"timestamp":1666083632547,"apiStatus":"success","apiCode":200,"meta":{"url":"google.com","followRedirect":true,"redirectedURL":"https://www.google.com/?gws_rd=ssl","test":{"id":"d20h1hb409qbfwm0g534l51asugpi5hl"}},"data":{"dns":12,"connect":17,"tls":6,"send":21,"wait":110,"total":114}}bool(true)
请求已成功完成,API 响应 JSON 数据。你可以随意使用这些数据。
使用 Guzzle
在本教程的最后一部分,我们将使用 Guzzle 来编写脚本。和往常一样,我们首先在 `with_guzzle.php` 文件中插入 PHP 代码结构:
<?php // 所有代码将放在这里 ?>
然后,我们可以导入扩展库、Guzzle 客户端和请求对象,并加载环境变量:
require_once('vendor/autoload.php'); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request;
接下来,我们可以加载环境变量:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
然后,我们可以实例化一个 Guzzle HTTP 客户端:
$client = new Client();
接下来,我们可以为我们的请求创建头部信息:
$headers = [ 'x-api-key' => $_ENV['API_KEY'], 'Content-Type' => 'application/json' ];
接下来,我们可以定义请求的主体:
$body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]);
然后,我们可以通过实例化 Request 类并传入 API 端点 URL、头部信息和请求主体来发送请求:
$request = new Request('POST', 'https://api.techblik.com.com/loadtime', $headers, $body);
然后,我们可以通过添加以下代码来发送请求:
$response = $client->sendAsync($request)->wait();
发送请求后,我们可以接收请求的主体,如下所示:
$response_body = $response->getBody();
最后,我们可以解码 JSON 响应并打印出加载时间:
echo "Loadtime: " . json_decode($response_body)->data->total . "n";
因此,最后,文件应如下所示:
<?php require_once('vendor/autoload.php'); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $client = new Client(); $headers = [ 'x-api-key' => $_ENV['API_KEY'], 'Content-Type' => 'application/json' ]; $body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]); $request = new Request('POST', 'https://api.techblik.com.com/loadtime', $headers, $body); $response = $client->sendAsync($request)->wait(); $response_body = $response->getBody(); echo "Loadtime: " . json_decode($response_body)->data->total . "n"; ?>
当你使用以下命令执行脚本时:
php with_guzzle.php
你将看到响应:
Loadtime: 130
结论
在本文中,我们介绍了在创建需要 techblik.com API 的 PHP 项目时,可能会使用到的不同客户端。
虽然这个项目中的脚本使用命令行作为主要的输出形式,但实际项目中可以将响应呈现在网页上或者写入到文件中。本文中的示例脚本很简单,但它们演示了使用 techblik.com API 的核心概念。如果要使用不同的 API,你可以更改端点,并在请求体中传递不同的选项。
你可能还会对如何在 JavaScript 中使用 techblik.com DNS Lookup API 感兴趣。