作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。
介绍
RESTful API用于各种不同的用途,如资源共享,任务自动化,远程验证等。例如,一些提供API的平台包括Facebook,LinkedIn,Twitter,GitHub和DigitalOcean。利用这些平台的API,您的应用程序可以与这些远程系统进行互动,而无需人为干预。
如果你熟悉使用PHP的应用程序开发(LINK0),你将能够使用现有服务来支持你的应用程序,而不会从头开始写大程序或保持复杂的基础设施在线。
在本教程中,您将使用 HTTP POST 和 GET 调用来构建 RESTful API 的客户端,以与服务器进行交互。您将构建一个 Web 应用程序,该应用程序将从 OpenWeather Map API 获取信息并显示它。
在处理新 API 时,一个好的起点是阅读文档,在这种情况下,您可以在 OpenWeather 指南中找到有用的信息。
前提条件
要完成本教程,您将需要:
- 启用了 XML 支持的 PHP 的本地开发环境,您可以按照教程的第 1 步执行, 如何在 Ubuntu 20.04 上安装 PHP 7.4 和设置本地开发环境。在第 1 步结束时安装额外的软件包时,在需要时,将
php7.4' 替换为
php8.0,并从包装安装命令中删除
php7.4-json` - 在您的机器上安装的作曲家,您可以按照教程的第 1-2 步执行, How to Install and Use Composer)。
- 熟悉 PHP,您可以从教程系列中获取, [How To Code in PHP(INKL2]])。
步骤 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`.
<$>
你会看到一个看起来像这样的屏幕:
点击 ** 获取伦敦的温度** 查看结果:
由于数据目前在应用程序中被硬编码,所以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 产品文件。
保存并关闭文件,当你完成。
回到您的浏览器并刷新页面以查看结果. 输出将看起来类似于此:
在此时,结果并不像用户所期望的那样:这会返回英国(‘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/>
元素的属性感兴趣:值
。
保存并关闭文件,当你完成。
回到您的浏览器,刷新页面,你应该看到类似于以下的东西:
您的输出中的数字可能不同,因为应用程序正在执行实时查询。
现在您的应用程序可以对 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’参数的值从‘伦敦’更改为用户选择的城市。
https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=
$_POST['city']
&appid=YOUR_API_KEY'
保存并关闭文件,当你完成。
<$>[注] **注:**这就是OpenWeather Map处理参数的方式。对于其他API,您需要参阅具体的文档以获取详细信息。
要查看您的更改,请返回您的浏览器并启动导航。
选择不同的城市现在应该返回不同的温度值。
在此步骤中,您已在应用程序中启用用户输入,并更新了数据源 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-guzzle
和 php-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
例外处理器,如果有一个未知的例外。
保存并关闭文件,当你完成。
如果您刷新页面,则将在输出中看到轻微的变化:
现在,摄氏度符号出现在温度旁边。
這是因為您的應用程式現在使用「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。