如何在 PHP 8.0 中使用网络 API

作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。

介绍

RESTful API用于各种不同的用途,如资源共享,任务自动化,远程验证等。例如,一些提供API的平台包括Facebook,LinkedIn,Twitter,GitHub和DigitalOcean。利用这些平台的API,您的应用程序可以与这些远程系统进行互动,而无需人为干预。

如果你熟悉使用PHP的应用程序开发(LINK0),你将能够使用现有服务来支持你的应用程序,而不会从头开始写大程序或保持复杂的基础设施在线。

在本教程中,您将使用 HTTP POST 和 GET 调用来构建 RESTful API 的客户端,以与服务器进行交互。您将构建一个 Web 应用程序,该应用程序将从 OpenWeather Map API 获取信息并显示它。

在处理新 API 时,一个好的起点是阅读文档,在这种情况下,您可以在 OpenWeather 指南中找到有用的信息。

前提条件

要完成本教程,您将需要:

步骤 1 – 构建 Web 应用程序的界面

在此步骤中,您将构建一个Web应用程序的基本版本,您将在以后的步骤中进行修改,在这里,您将创建一个HTML表格和一个请求处理器。

首先,创建一个项目目录(天气应用程序)并导航。

1mkdir weather-app 
2cd weather-app

使用您最喜欢的文本编辑器或nano,创建一个index.php文件:

1nano index.php

将以下内容复制到您的文件中:

 1[label weather-app/index.php]
 2<html>
 3<body>
 4    <h1>Weather query</h1>
 5<?php
 6if ( 'post' === strtolower($_SERVER['REQUEST_METHOD']) ) {
 7?>
 8    <h2>6.36</h2>
 9<?php
10} else {
11?>
12    <form method="post">
13        <input type="submit" value="Get London's temperature">
14    </form>
15<?php
16}
17?>
18</body>
19</html>

第一个如果语句将HTML表格和请求处理器分开,而它正在检查(‘post’ === strtolower($_SERVER['REQUEST_METHOD']))的条件是验证哪个HTTP语句被用来生成请求。在这里,你使用比较 'post' === strtolower($_SERVER['REQUEST_METHOD'])而不是简单的 'post' === $_SERVER['REQUEST_METHOD']`来规范值,而不是取决于Web服务器或浏览器配置。

如果方法是帖子,这意味着请求源于表单提交,所以我们知道我们在第二步. 如果方法不是帖子,你可以安全地假设这是用户的第一次访问网站,所以有意义向他们展示表单,让他们启动工作流程,在这种情况下,意味着要求伦敦的温度。

仔细观察如果语句的 then 部分,你会注意到有一个固定的6.36值。

保存并关闭文件,当你完成。

接下来,通过运行以下命令启动内置的 PHP Web 服务器:

1php -S localhost:8707

结果将是这样的:

1[Wed Nov 17 11:54:10 2021] PHP 8.0.12 Development Server (http://localhost:8707) started

然后,在浏览器中打开一个新标签,并将其指向http://localhost:8707

注意:如果您正在使用远程计算机,如前提教程中所述, 如何在Ubuntu 20.04上安装PHP 7.4和设置本地开发环境,您可以使用端口转发来查看您的应用程序。启动PHP Web服务器后,在本地计算机上打开一个新的终端,并运行此命令: ssh -L 8707:localhost:8707 your-non-root-user@your-server-ip. 成功连接到远程服务器后,您可以查看您的应用程序在http://localhost:8707`. <$>

你会看到一个看起来像这样的屏幕:

A screenshot showing the basic weather app. The text "Weather query" appears above a button with the text "Get London's Temperature."

点击 ** 获取伦敦的温度** 查看结果:

A page showing a hardcoded response

由于数据目前在应用程序中被硬编码,所以6.36是唯一可能的答案。

在此步骤中,您创建了一个 Web 应用程序,允许用户启动当前在伦敦的温度查询,该查询目前是硬编码的。

步骤 2 – 从 RESTful API 获取数据

在此步骤中,您将更新您的应用程序以从可信来源(OpenWeather Map)获取数据。

有很多方法可以使用PHP从RESTful API中获取信息,最常见的方法之一是使用 curl library

在这里,您将使用函数 file_get_contents从 RESTful API 读取。您可能熟悉使用此函数读取本地文件,但PHP 的 流管理系统在许多底层存储机制中提供相同的抽象性。

如果您需要以更复杂的方式与服务器进行交互 - 例如使用身份验证 - 您可以通过指定特定的 stream_context作为第三个参数来做到这一点。

要从 OpenWeather 地图 API 获取数据,请打开 index.php 进行编辑并如下所示更新:

 1[label weather-app/index.php]
 2<html>
 3<body>
 4    <h1>Weather query</h1>
 5<?php
 6if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
 7?>
 8    <h2><?php echo file_get_contents('https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY'); ?></h2>
 9<?php
10} else {
11    ?>
12    <form method="post">
13        <input type="submit" value="Get London's temperature">
14    </form>
15<?php
16}?>
17</body>
18</html>

请记住将YOUR_API_KEY更改为您的 OpenWeather API 密钥的实际值。

此脚本采用固定URL https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY,进行HTTP调用,并输出响应,正如它接收的。

这个URL由:

  • 一个基本的 URL (https://api.openweathermap.org/data/2.5/)
  • 一个终端(weather)
  • 查询字符串(?mode=xml&units=metric&q=London&appid=YOUR_API_KEY)

这是 RESTful API 的常见结构. 基本 URL 将是相同的,无论您正在寻找什么资源. 端点将根据您正在寻找的特定类型的信息而有所不同,最后,查询字符串将被用来提供一些选项来完善您的请求。

在这种情况下,我们使用以下修改器:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

有关其他参数,请参阅 OpenWeather 产品文件

保存并关闭文件,当你完成。

回到您的浏览器并刷新页面以查看结果. 输出将看起来类似于此:

A page showing country and timezone information

在此时,结果并不像用户所期望的那样:这会返回英国(‘GB’)和时区(‘3600’)的国家标识。

如果您查看页面的源代码,则会看到类似于以下的输出:

 1[label Source code for the web app]
 2<html>
 3<body>
 4<h1>Weather query</h1>
 5<h2>
 6  <?xml version="1.0" encoding="UTF-8"?>
 7  <current>
 8    <city id="2643743" name="London">
 9      <coord lon="-0.1257" lat="51.5085"></coord>
10      <country>GB</country>
11      <timezone>3600</timezone>
12      <sun rise="2022-04-12T05:11:24" set="2022-04-12T18:50:48"></sun>
13    </city>
14    <temperature value="18.21" min="15.02" max="19.87" unit="celsius"></temperature>
15    <feels_like value="17.73" unit="celsius"></feels_like>
16    <humidity value="63" unit="%"></humidity>
17    <pressure value="1006" unit="hPa"></pressure>
18    <wind>
19      <speed value="4.63" unit="m/s" name="Gentle Breeze"></speed>
20      <gusts></gusts>
21      <direction value="210" code="SSW" name="South-southwest"></direction>
22    </wind>
23    <clouds value="40" name="scattered clouds"></clouds>
24    <visibility value="10000"></visibility>
25    <precipitation mode="no"></precipitation>
26    <weather number="802" value="scattered clouds" icon="03d"></weather>
27    <lastupdate value="2022-04-12T14:11:48"></lastupdate>
28  </current>
29</h2>
30</body>
31</html>

问题是,你的脚本正在输出API服务器的响应,正如它接收的那样,所以它是由浏览器正确渲染的。由于API服务器的响应是XML,浏览器会尽其所能地解释标签:所有的非HTML标签(如城市温度等)都被浏览器忽略了。

在此步骤中,您更新了应用程序以查询远程 API 并获取实时信息。

步骤 3 – 显示数据

在此时,您的应用程序会询问远程服务器并收到响应,因为收到的信息是XML,因此需要进行分析以获取特定信息,例如城市的温度。

一个方法是手动分析数据,例如通过 常规表达式。 然而,这种方法既可以复杂又容易出现错误。 一个更好的方法是使用类 SimpleXMLElement)。 这个类专门用于处理 XML 的复杂性,并提供一个易于使用的界面。

打开你的index.php文件进行编辑,并更新它看起来像这样:

 1[label weather-app/index.php]
 2<html>
 3<body>
 4    <h1>Weather query</h1>
 5<?php
 6if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
 7    ?><h2><?php
 8    $xml = new SimpleXMLElement('https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY', 0, true);
 9    echo $xml->temperature['value'];
10    ?></h2>
11<?php
12} else {
13    ?>
14    <form method="post">
15        <input type="submit" value="Get London's temperature">
16    </form>
17<?php
18}?>
19</body>
20</html>

请记住,用您的 API 密钥的实际值代替YOUR_API_KEY

「$xml」是「SimpleXMLElement」的一个实例. XML 文本中的每个子节点都是其公共财产,其属性可作为数组密钥访问。

在此情况下,您将指定一个 URL 作为 XML 数据的来源: https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY

接下来是选项编辑器,它指定了如何解释 XML。在这种情况下,您使用的是0,这意味着应该使用默认选项。第三个参数是true值。一个SimpleXMLElement对象可以使用两个可能的来源创建:一个字面 XML 值或一个 URL。

该行echo $xml->temperature[‘value’];利用SimpleXMLElement提供的面向对象界面,该类的基本功能是将假设是形成良好的XML的字符串转换成易于使用的树结构。

所以,如果你回头看看服务器返回的XML:

 1[label Source code for the web app]
 2<?xml version="1.0" encoding="UTF-8"?>
 3  <current>
 4    <city id="2643743" name="London">
 5      <coord lon="-0.1257" lat="51.5085"></coord>
 6      <country>GB</country>
 7      <timezone>3600</timezone>
 8      <sun rise="2022-04-12T05:11:24" set="2022-04-12T18:50:48"></sun>
 9    </city>
10    <temperature value="18.21" min="15.02" max="19.87" unit="celsius"></temperature>
11    <feels_like value="17.73" unit="celsius"></feels_like>
12    <humidity value="63" unit="%"></humidity>
13    <pressure value="1006" unit="hPa"></pressure>
14    <wind>
15      <speed value="4.63" unit="m/s" name="Gentle Breeze"></speed>
16      <gusts></gusts>
17      <direction value="210" code="SSW" name="South-southwest"></direction>
18    </wind>
19    <clouds value="40" name="scattered clouds"></clouds>
20    <visibility value="10000"></visibility>
21    <precipitation mode="no"></precipitation>
22    <weather number="802" value="scattered clouds" icon="03d"></weather>
23    <lastupdate value="2022-04-12T14:11:48"></lastupdate>
24  </current>

您将看到$xml对象具有以下属性:

  • city
  • temperature
  • feels_like
  • humidity
  • pressure
  • wind
  • clouds
  • visibility
  • precipitation
  • weather
  • lastupdate

这些属性中的每一个也是SimpleXMLElement的实例。

在这种情况下,您只对<temperature/>元素的属性感兴趣:

保存并关闭文件,当你完成。

回到您的浏览器,刷新页面,你应该看到类似于以下的东西:

A page showing current London's temperature

您的输出中的数字可能不同,因为应用程序正在执行实时查询。

现在您的应用程序可以对 XML 数据进行分析。 SimpleXMLElement 正在从您提供的 URL 读取,分析结果,并构建远程服务器返回的文本的对象化表示。

在此时,你的脚本可以显示来自可信来源的实时信息,以对最终用户有意义的格式。

步骤 4 – 允许用户输入

在此步骤中,您将允许用户查询不同城市的温度,您将通过更改数据源 URL 来从远程服务器获取不同的结果来执行此操作。

第一個變更是在第一個屏幕上顯示一個城市下滑,以便使用者可以選擇他們感興趣的城市。

 1[label weather-app/index.php]
 2<html>
 3<body>
 4    <h1>Weather query</h1>
 5<?php
 6if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
 7    ?><h2><?php
 8    $xml = new SimpleXMLElement('https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY', 0, true);
 9    echo $xml->temperature['value'];
10    ?></h2>
11<?php
12} else {
13    ?>
14    <form method="post">
15        <label for="city">Select your city</label>
16        <select name="city" id="city">
17            <option value="London">London</option>
18            <option value="Buenos Aires">Buenos Aires</option>
19            <option value="New York">New York</option>
20            <option value="Paris">Paris</option>
21        </select>
22        <input type="submit" value="Get your city's temperature">
23    </form>
24<?php
25}?>
26</body>
27</html>

现在,应用程序将为用户显示下载选项,以便他们可以选择他们想要获取信息的城市,而不是将其固定为伦敦

但是,要将脚本查询选定的城市,您还需要更改如果语句的第一部分。

 1[label weather-app/index.php]
 2<html>
 3<body>
 4    <h1>Weather query</h1>
 5<?php
 6if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
 7    ?><h2><?php
 8    $xml = new SimpleXMLElement('`https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=`'.$_POST['city'].'&appid=YOUR_API_KEY', 0, true);
 9    echo $xml->temperature['value'];
10    ?></h2>
11<?php
12} else {
13    ?>
14    <form method="post">
15        <label for="city">Select your city</label>
16        <select name="city" id="city">
17            <option value="London">London</option>
18            <option value="Buenos Aires">Buenos Aires</option>
19            <option value="New York">New York</option>
20            <option value="Paris">Paris</option>
21        </select>
22        <input type="submit" value="Get your city's temperature">
23    </form>
24<?php
25}?>
26</body>
27</html>

在这里,您将‘q’参数的值从‘伦敦’更改为用户选择的城市。

  1. https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=
  2. $_POST['city']
  3. &appid=YOUR_API_KEY'

保存并关闭文件,当你完成。

<$>[注] **注:**这就是OpenWeather Map处理参数的方式。对于其他API,您需要参阅具体的文档以获取详细信息。

要查看您的更改,请返回您的浏览器并启动导航。

A page showing a city dropdown

选择不同的城市现在应该返回不同的温度值。

在此步骤中,您已在应用程序中启用用户输入,并更新了数据源 URL,以根据用户的选择获取数据。

然而,在这个时候,您的代码与当前的API响应结构紧密相连,这不是非常有前途可靠的。目前,寻找温度标签作为根元素的第一级子女是有道理的,但这可能随时发生变化,如果发生这种情况,应用程序代码将不得不更新以保持其工作。

步骤 5 – 安装软件开发套件(SDK)

在此步骤中,您将安装 OpenWeather Map PHP Client。这个客户端完全将您的应用程序逻辑与如何与OpenWeather Map服务器进行通信的具体细节隔离,从而有效地产生更具前瞻性的应用程序。

例如,如果服务器希望客户端与其互动的方式发生变化,您只需要在您的端更新 SDK。 相比之下,如果您自己编码请求,调整代码将需要大量的努力来跟踪每个远程呼叫并更新它。

在本教程中,您将使用 Composer,PHP的依赖管理器,您安装作为前提的一部分。

一旦您有 Composer 可用,请运行以下命令来安装 SDK 及其依赖:

1composer require "cmfcmf/openweathermap-php-api" "http-interop/http-factory-guzzle:^1.0" "php-http/guzzle6-adapter:^2.0 || ^1.0"

该 SDK本身就是包 cmfcmf/openweathermap-php-api. http-interop/http-factory-guzzlephp-http/guzzle6-adapter 是处理低级别的 HTTP 通信所需的辅助包。

这将产生以下产出:

 1Using version ^3.3 for cmfcmf/openweathermap-php-api
 2./composer.json has been created
 3Running composer update cmfcmf/openweathermap-php-api http-interop/http-factory-guzzle php-http/guzzle6-adapter
 4Loading composer repositories with package information
 5Updating dependencies
 6Lock file operations: 16 installs, 0 updates, 0 removals
 7  - Locking cmfcmf/openweathermap-php-api (v3.3.0)
 8  - Locking guzzlehttp/guzzle (6.5.5)
 9  - Locking guzzlehttp/promises (1.5.1)
10  - Locking guzzlehttp/psr7 (1.8.3)
11  - Locking http-interop/http-factory-guzzle (1.2.0)
12  - Locking php-http/guzzle6-adapter (v2.0.2)
13  - Locking php-http/httplug (2.2.0)
14  - Locking php-http/promise (1.1.0)
15  - Locking psr/cache (1.0.1)
16  - Locking psr/http-client (1.0.1)
17  - Locking psr/http-factory (1.0.1)
18  - Locking psr/http-message (1.0.1)
19  - Locking ralouphie/getallheaders (3.0.3)
20  - Locking symfony/polyfill-intl-idn (v1.23.0)
21  - Locking symfony/polyfill-intl-normalizer (v1.23.0)
22  - Locking symfony/polyfill-php72 (v1.23.0)
23Writing lock file
24Installing dependencies from lock file (including require-dev)
25Package operations: 16 installs, 0 updates, 0 removals
26  - Installing psr/http-message (1.0.1): Extracting archive
27  - Installing psr/http-factory (1.0.1): Extracting archive
28  - Installing psr/http-client (1.0.1): Extracting archive
29  - Installing psr/cache (1.0.1): Extracting archive
30  - Installing cmfcmf/openweathermap-php-api (v3.3.0): Extracting archive
31  - Installing guzzlehttp/promises (1.5.1): Extracting archive
32  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
33  - Installing guzzlehttp/psr7 (1.8.3): Extracting archive
34  - Installing http-interop/http-factory-guzzle (1.2.0): Extracting archive
35  - Installing php-http/promise (1.1.0): Extracting archive
36  - Installing php-http/httplug (2.2.0): Extracting archive
37  - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive
38  - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
39  - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive
40  - Installing guzzlehttp/guzzle (6.5.5): Extracting archive
41  - Installing php-http/guzzle6-adapter (v2.0.2): Extracting archive
422 package suggestions were added by new dependencies, use `composer suggest` to see details.
43Generating autoload files
446 packages you are using are looking for funding.
45Use the `composer fund` command to find out more!

现在你有一个新的目录在你的项目中:‘供应商’. 这个目录是通过Composer安装的每一个依赖的位置。

与库代码一起,有一个提供访问所有这些文件的文件: autoload.php. 您需要在每个脚本开始时包含此文件,需要使用您引入的任何依赖。

在此步骤中,您为您的应用程序添加了一种新的依赖性:为 OpenWeather Map API 提供面向对象的客户端. 通过依赖它,您将获得更清洁的编码界面,这将有助于您减少更新代码以匹配新版本的 API 的总体努力。

步骤 6 — 使用 SDK 重构您的 Web 应用程序

在此步骤中,您将重构代码以使用上一步安装的SDK,您将需要脚本中的SDK代码,并使用库中提供的对象访问远程API。

打开index.php来编辑并更新它看起来像这样:

 1[label weather-app/index.php]
 2<?php
 3use Cmfcmf\OpenWeatherMap;
 4use Cmfcmf\OpenWeatherMap\Exception as OWMException;
 5use Http\Factory\Guzzle\RequestFactory;
 6use Http\Adapter\Guzzle6\Client as GuzzleAdapter;
 7?>
 8<html>
 9<body>
10    <h1>Weather query</h1>
11<?php
12if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
13    require_once 'vendor/autoload.php';
14    $city = $_POST['city'];
15
16    $owm = new OpenWeatherMap('YOUR_API_KEY', GuzzleAdapter::createWithConfig([]), new RequestFactory());
17
18    try {
19        $weather = $owm->getWeather($city, 'metric', 'en');
20        ?><h2><?php echo $weather->temperature; ?></h2>
21        <?php
22    } catch(OWMException $e) {
23        echo 'OpenWeatherMap exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
24    } catch(\Exception $e) {
25        echo 'General exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
26    }
27} else {
28    ?>
29    <form method="post">
30        <label for="city">Select your city</label>
31        <select name="city" id="city">
32            <option value="London">London</option>
33            <option value="Buenos Aires">Buenos Aires</option>
34            <option value="New York">New York</option>
35            <option value="Paris">Paris</option>
36        </select>
37        <input type="submit" value="Get your city's temperature">
38    </form>
39<?php
40}?>
41</body>
42</html>

请记住,用你的 API 密钥的实际值代替YOUR_API_KEY

使用这些行,你指示译员如何将短类名称绘制成完全分类的名称(例如,‘OpenWeatherMap’到‘Cmfcmf\OpenWeatherMap’),使代码更容易阅读和写入。

这个文件是由composer创建的,并且包含必要的呼叫到 spl_autoload_register,以允许您创建新的类的实例,不是明确要求你的脚本。

最显著的变化是使用一种方法(getWeather)来调用远程服务器,让您的代码清洁,并且随着时间的推移更容易维护。HTTP调用和转换文本为PHP对象是为您做的。

在处理外部系统时,预测问题是很好的做法,例如远程服务器变得不响应或本地网络失败。如果您不捕捉例外,如果它们发生,它们将产生不愉快的用户体验,甚至可能会破坏系统的稳定性,因为脚本执行会意外停止。

由于方法OpenWeatherMap::getWeather抛出特定的例外(OWMException),所以使用它们并留下另一个catch-all例外处理器,如果有一个未知的例外。

保存并关闭文件,当你完成。

如果您刷新页面,则将在输出中看到轻微的变化:

A result including the Celsius symbol

现在,摄氏度符号出现在温度旁边。

這是因為您的應用程式現在使用「echo $weather->temperature;」來產生其出力,而「$weather->temperature」是「Cmfcmf\OpenWeatherMap\Util\Temperature」類別的對象,它實施了一種「__toString」方法,其中包括其返回值中的單位。

在此步骤中,您通过利用现有 SDK 来抽象低级别的通信细节,使您的应用程序更易于维护。

只有一个最后一步,让您的应用程序生产准备好了:删除硬编码的API_KEY。如果密钥保持硬编码,每次你在不同的环境中部署应用程序,你将不得不进入代码来使它工作,这是一个错误的来源。

步骤 7 – 删除硬码

到目前为止,您一直在使用一块硬编码的数据:您的 OpenWeather API 密钥. 删除硬编码的信息允许您的应用程序在不同的环境中运行,这对于实际应用程序来说是一个关键的功能,您想要有多个执行环境(dev、test、prod等)。

在此步骤中,您将通过删除硬编码的API密钥来准备您的应用程序在不同的环境之间部署。

一个技术是将此类信息存储在环境变量中,这些变量可以在PHP脚本中通过$_ENV数组访问。

要使用此方法,打开你的index.php文件进行编辑,并更新突出的部分:

 1[label weather-app/index.php]
 2<?php
 3use Cmfcmf\OpenWeatherMap;
 4use Cmfcmf\OpenWeatherMap\Exception as OWMException;
 5use Http\Factory\Guzzle\RequestFactory;
 6use Http\Adapter\Guzzle6\Client as GuzzleAdapter;
 7?>
 8<html>
 9<body>
10    <h1>Weather query</h1>
11<?php
12if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
13    require_once 'vendor/autoload.php';
14    $city = $_POST['city'];
15
16    $owm = new OpenWeatherMap($_ENV['API_KEY'], GuzzleAdapter::createWithConfig([]), new RequestFactory());
17
18    try {
19        $weather = $owm->getWeather($city, 'metric', 'en');
20        ?><h2><?php echo $weather->temperature; ?></h2>
21        <?php
22    } catch(OWMException $e) {
23        echo 'OpenWeatherMap exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
24    } catch(\Exception $e) {
25        echo 'General exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
26    }
27} else {
28    ?>
29    <form method="post">
30        <label for="city">Select your city</label>
31        <select name="city" id="city">
32            <option value="London">London</option>
33            <option value="Buenos Aires">Buenos Aires</option>
34            <option value="New York">New York</option>
35            <option value="Paris">Paris</option>
36        </select>
37        <input type="submit" value="Get your city's temperature">
38    </form>
39<?php
40}?>
41</body>
42</html>

保存并关闭文件,当你完成。

要使更改生效,您需要停止本地 Web 服务器并使用此命令重新启动:

1API_KEY=YOUR_API_KEY php -d variables_order=EGPCS -S localhost:8707

YOUR_API_KEY替换为您的 API 密钥的实际值。

在这个调用中,你首先确定了环境变量的值,然后调用了PHP解释器,操作系统将为PHP过程创建一个新的运行环境,包括API关键定义。

在这个情况下,‘variables_order’ 定义确定了 superglobal是如何人口的。 值 EGPCS 意味着环境, Get, 邮件, Cookie, 服务器. 您可以阅读更多有关此事(在 PHP 文档中)(https://www.php.net/manual/en/ini.core.php#ini.variables-order)。

在生产环境中,您可以使用 Web 服务器配置来设置这些值。

在此步骤中,您删除了API 密钥的硬编码,并使用了环境变量,现在您的应用程序更适合在不同的环境中运行。

结论

在本文中,您建立了一个Web应用程序,允许用户查询OpenWeather地图并获取他们选择的城市的当前温度。您使用file_get_contents获取了远程RESTful API的数据,并使用SimpleXMLElement分析了XML数据。您还使用了SDK来访问可用的远程API。

作为下一步,您可以转向更复杂的API,并看到基本原则是如何相同的。

请记住,RESTful API 并不是唯一存在的 API 类型。 SOAP是一个非常不同的协议,在许多场景中仍然使用,尤其是在政府机构中,所以您可能还想熟悉其他类型的 API。

Published At
Categories with 技术
comments powered by Disqus