PHP8.0でWebAPIを使用する方法
序章
RESTful API は、リソース共有、タスク自動化、リモート検証など、さまざまな方法でさまざまな目的に使用されます。 たとえば、APIを提供するプラットフォームには、Facebook、LinkedIn、Twitter、GitHub、DigitalOceanなどがあります。 これらのプラットフォームのAPIを活用することで、アプリケーションは人間の介入なしにこれらのリモートシステムと対話できます。 たとえば、アプリケーションでユーザーのFacebookウォールに写真を投稿し、LinkedInを使用してユーザーの身元を確認し、負荷が大きすぎる場合に新しいDigitalOceanドロップレットを生成することができます。
PHP を使用したアプリケーション開発に精通している場合は、大規模なプログラムを最初から作成したり、複雑なインフラストラクチャをオンラインに維持したりすることなく、既存のサービスを使用してアプリケーションを強化できます。
このチュートリアルでは、HTTP POSTおよびGET呼び出しを使用してサーバーと対話することにより、RESTfulAPIのクライアントを構築します。 OpenWeather MapAPIから情報を取得して表示するWebアプリケーションを構築します。 ユーザー入力を有効にし、ソフトウェア開発キット(SDK)を使用してコードの将来を保証する前に、基本的なアプリから始めます。 最終的なWebアプリケーションは、選択した都市に関するリアルタイムの気象情報をユーザーに提供します。
新しいAPIを扱うときは、ドキュメントを読むことから始めることをお勧めします。 この場合、OpenWeatherガイドで役立つ情報を見つけることができます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- XMLサポートが有効になっているPHPのローカル開発環境。これは、チュートリアルのステップ1、PHP7.4をインストールしてUbuntu20.04にローカル開発環境をセットアップする方法に従って実行できます。 手順1の最後に追加のパッケージをインストールする場合は、
php7.4
とphp8.0
必要に応じて削除php7.4-json
パッケージインストールコマンドから。 - チュートリアルのステップ1〜2、Composerのインストールと使用方法に従って実行できるComposerがマシンにインストールされています。
- チュートリアルシリーズPHPでのコーディング方法から得られるPHPの知識。
- 無料アカウントを作成することで取得できるOpenWeatherMapのAPIキー。 登録後、アカウントのマイAPIキーに移動します。
ステップ1—Webアプリのインターフェイスを構築する
このステップでは、Webアプリケーションの基本バージョンを作成します。これは、後のステップで変更します。 ここでは、HTMLフォームとリクエストハンドラーを作成します。
プロジェクトのディレクトリを作成することから始めます(weather-app
)そしてそれにナビゲートします。
- mkdir weather-app
- cd weather-app
お気に入りのテキストエディタを使用するか nano
、作成する index.php
ファイル:
- nano index.php
次の内容をファイルにコピーします。
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD']) ) {
?>
<h2>6.36</h2>
<?php
} else {
?>
<form method="post">
<input type="submit" value="Get London's temperature">
</form>
<?php
}
?>
</body>
</html>
最初 if
ステートメントは、HTMLフォームとリクエストハンドラーを分離します。 チェックしている状態('post' === strtolower($_SERVER['REQUEST_METHOD'])
)は、リクエストの生成に使用されたHTTP動詞を確認しています。 ここでは、比較を使用します 'post' === strtolower($_SERVER['REQUEST_METHOD'])
単純な代わりに 'post' === $_SERVER['REQUEST_METHOD']
Webサーバーまたはブラウザーの構成に依存する代わりに、値を正規化します。
メソッドが post
、つまり、リクエストはフォームの送信から発信されたため、2番目のステップにいることがわかります。 メソッドがそうでない場合 post
、ユーザーが初めてサイトにアクセスしたと安全に想定できるため、フォームを表示してワークフローを開始させることは理にかなっています。この場合は、ロンドンの気温を尋ねることを意味します。
の次にの部分を詳しく見てみましょう。 if
ステートメント、あなたは固定されていることに気付くでしょう 6.36
価値。 これはランダムなプレースホルダー番号であり、後でライブデータに置き換えます。
完了したら、ファイルを保存して閉じます。
次に、次のコマンドを実行して、組み込みのPHPWebサーバーを起動します。
- php -S localhost:8707
出力は次のようになります。
[Wed Nov 17 11:54:10 2021] PHP 8.0.12 Development Server (http://localhost:8707) started
次に、ブラウザで新しいタブを開き、それをポイントします http://localhost:8707
.
注:前提条件のチュートリアル PHP7.4をインストールしてUbuntu20.04にローカル開発環境をセットアップする方法のようにリモートマシンを使用している場合は、ポート転送を使用して表示できますあなたのアプリ。 PHP Webサーバーを起動した後、ローカルマシンで新しいターミナルを開き、次のコマンドを実行します。 ssh -L 8707:localhost:8707 your-non-root-user@your-server-ip
. リモートサーバーへの接続が成功すると、次の場所でアプリを表示できます。 http://localhost:8707
.
次のような画面が表示されます。
ロンドンの気温を取得をクリックして、結果を確認します。
データは現在アプリケーションにハードコーディングされているため、 6.36
可能な唯一の応答です。
このステップでは、ユーザーが現在ハードコーディングされているロンドンの現在の気温のクエリを開始できるようにするWebアプリケーションを作成しました。 次のステップでは、APIからデータを取得するようにアプリを更新します。
ステップ2—RESTfulAPIからデータを取得する
このステップでは、信頼できるソース(OpenWeather Map)からデータをフェッチするようにアプリケーションを更新します。
PHPを使用してRESTfulAPIから情報を取得する方法はたくさんあります。 最も一般的な方法の1つは、curlライブラリを使用することです。 このライブラリは完全に機能しますが、HTTP通信を低レベルで制御するように設計されているため、多くの場合、煩雑になる可能性があります。
ここでは、関数file_get_contentsを使用してRESTfulAPIから読み取ります。 この関数を使用してローカルファイルを読み取ることはご存知かもしれませんが、PHPのストリーム管理システムは、多くの基盤となるストレージメカニズムに対して同じ抽象化を提供します。 使用できます file_get_contents
ローカルドライブにあるかのようにリモートファイルから読み取る。 RESTfulリソースはURIによって識別されるため、そのエンドポイントを関数にフィードすると、リモートサーバーから送信された応答の内容(すでにヘッダーが削除されている)が返されます。
認証を使用するなど、より複雑な方法でサーバーと対話する必要がある場合は、3番目のパラメーターとして特定のstream_contextを指定することで実行できます。
OpenWeather Map APIからデータを取得するには、 index.php
図のように編集および更新します。
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
?>
<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>
<?php
} else {
?>
<form method="post">
<input type="submit" value="Get London's temperature">
</form>
<?php
}?>
</body>
</html>
変更することを忘れないでください YOUR_API_KEY
OpenWeatherAPIキーの実際の値。
このスクリプトは固定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
)
これは、RESTfulAPIの一般的な構造です。 探しているリソースに関係なく、ベースURLは同じになります。 エンドポイントは、探している特定の種類の情報によって異なります。最後に、クエリ文字列を使用して、リクエストを絞り込むためのいくつかのオプションを提供します。
この場合、次の修飾子を使用しています。
mode
:応答で使用する形式、xml
私たちの場合には。units
: 測定単位、metric
私たちの場合には。q
:都市表現、London
私たちの場合には。appid
:APIキー。
追加のパラメーターについては、OpenWeather製品のドキュメントを参照してください。
完了したら、ファイルを保存して閉じます。
ブラウザに戻り、ページを更新して結果を確認します。 出力は次のようになります。
この時点では、結果はユーザーが期待するものではありません。これにより、英国の国の指定が返されます(GB
)とタイムゾーン(3600
).
このページのソースコードを見ると、次のような出力が表示されます。
<html>
<body>
<h1>Weather query</h1>
<h2>
<?xml version="1.0" encoding="UTF-8"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.1257" lat="51.5085"></coord>
<country>GB</country>
<timezone>3600</timezone>
<sun rise="2022-04-12T05:11:24" set="2022-04-12T18:50:48"></sun>
</city>
<temperature value="18.21" min="15.02" max="19.87" unit="celsius"></temperature>
<feels_like value="17.73" unit="celsius"></feels_like>
<humidity value="63" unit="%"></humidity>
<pressure value="1006" unit="hPa"></pressure>
<wind>
<speed value="4.63" unit="m/s" name="Gentle Breeze"></speed>
<gusts></gusts>
<direction value="210" code="SSW" name="South-southwest"></direction>
</wind>
<clouds value="40" name="scattered clouds"></clouds>
<visibility value="10000"></visibility>
<precipitation mode="no"></precipitation>
<weather number="802" value="scattered clouds" icon="03d"></weather>
<lastupdate value="2022-04-12T14:11:48"></lastupdate>
</current>
</h2>
</body>
</html>
問題は、スクリプトがAPIサーバーの応答を受信したとおりに正確に出力しているため、正しくレンダリングするのはブラウザーの責任であるということです。 APIサーバーの応答はXMLであるため、ブラウザーはタグを最大限に解釈します。つまり、HTML以外のすべてのタグ( city
, temperature
、など)はブラウザによって無視されます。 この問題に対処するには、アプリケーションを更新してXML応答を解析し、ユーザーにとって意味のある部分(コンテンツ)を抽出します。 temperature
鬼ごっこ。
このステップでは、リモートAPIにクエリを実行し、リアルタイムの情報を取得するようにアプリケーションを更新しました。 次のステップでは、受信したXMLデータを解析するようにアプリを更新します。
ステップ3—データの表示
この時点で、アプリはリモートサーバーにクエリを実行し、応答を受信します。 受信した情報はXMLであるため、都市の気温などの特定の情報を取得するために解析する必要があります。 このステップでは、アプリを更新してXML応答を変換し、ユーザーに関連する情報を表示します。
1つのアプローチは、正規表現などを使用してデータを手動で解析することです。 ただし、このアプローチは複雑でエラーが発生しやすい可能性があります。 より良いアプローチは、クラスSimpleXMLElementを使用することです。 このクラスは、XMLの複雑さを処理するように特別に設計されており、使いやすいインターフェースを提供します。
あなたの index.php
編集用のファイルと次のように更新します。
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
?><h2><?php
$xml = new SimpleXMLElement('https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY', 0, true);
echo $xml->temperature['value'];
?></h2>
<?php
} else {
?>
<form method="post">
<input type="submit" value="Get London's temperature">
</form>
<?php
}?>
</body>
</html>
交換することを忘れないでください YOUR_API_KEY
APIキーの実際の値を使用します。
$xml
のインスタンスです SimpleXMLElement
. XMLテキスト内のすべての子ノードはそのパブリックプロパティであり、属性は配列キーとしてアクセスできます。
クラスコンストラクターの呼び出しは、3つのパラメーターを指定することによって行われます。 1つ目はデータソースです。 この場合、XMLデータのソースとしてURLを指定します。 https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY
.
次は、XMLの解釈方法を指定するオプション修飾子です。 この場合、使用しているのは 0
、デフォルトのオプションを使用する必要があることを意味します。 3番目の引数は true
価値。 A SimpleXMLElement
オブジェクトは、リテラルXML値またはURLの2つの可能なソースを使用して作成できます。 発行することにより true
、URLが使用されると言っています。
この線 echo $xml->temperature['value'];
によって提供されるオブジェクト指向インターフェースを活用しています SimpleXMLElement
. このクラスの基本的な機能は、整形式のXMLであると思われる文字列を使いやすいツリー構造に変換することです。
したがって、サーバーから返されたXMLを振り返ると、次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.1257" lat="51.5085"></coord>
<country>GB</country>
<timezone>3600</timezone>
<sun rise="2022-04-12T05:11:24" set="2022-04-12T18:50:48"></sun>
</city>
<temperature value="18.21" min="15.02" max="19.87" unit="celsius"></temperature>
<feels_like value="17.73" unit="celsius"></feels_like>
<humidity value="63" unit="%"></humidity>
<pressure value="1006" unit="hPa"></pressure>
<wind>
<speed value="4.63" unit="m/s" name="Gentle Breeze"></speed>
<gusts></gusts>
<direction value="210" code="SSW" name="South-southwest"></direction>
</wind>
<clouds value="40" name="scattered clouds"></clouds>
<visibility value="10000"></visibility>
<precipitation mode="no"></precipitation>
<weather number="802" value="scattered clouds" icon="03d"></weather>
<lastupdate value="2022-04-12T14:11:48"></lastupdate>
</current>
あなたはそれを見るでしょう $xml
オブジェクトには次のプロパティがあります。
city
temperature
feels_like
humidity
pressure
wind
clouds
visibility
precipitation
weather
lastupdate
これらの各プロパティは、 SimpleXMLElement
.
この場合、あなたはの属性にのみ興味があります <temperature/>
エレメント: value
. だから、を使用して $xml->temperature['value']
あなたが得る 18.21
上記の例では。
完了したら、ファイルを保存して閉じます。
ブラウザに戻り、ページを更新すると、次のようなものが表示されます。
出力の数はおそらく異なります。 アプリケーションがリアルタイムクエリを実行しているため、これは予想されることです。
これで、アプリはXMLデータを解析できます。 SimpleXMLElement
は、指定したURLから読み取り、結果を解析し、リモートサーバーから返されたテキストのオブジェクト指向表現を構築しています。 それが完了すると、アプリケーションは温度値をプロパティとして参照できます。 SimpleXMLElement
物体。
この時点で、スクリプトは、信頼できるソースから取得したライブ情報を、エンドユーザーにとって意味のある形式で表示できます。 次のステップでは、ユーザー入力を有効にして、アプリに双方向性を導入します。
ステップ4—ユーザー入力を有効にする
このステップでは、ユーザーがさまざまな都市の気温を照会できるようにします。 これを行うには、データソースのURLを変更して、リモートサーバーからさまざまな結果を取得します。
最初の変更は、最初の画面に都市のドロップダウンを表示して、ユーザーが興味のある都市を選択できるようにすることです。 開ける index.php
図のようにフォームを編集および更新します。
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
?><h2><?php
$xml = new SimpleXMLElement('https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=London&appid=YOUR_API_KEY', 0, true);
echo $xml->temperature['value'];
?></h2>
<?php
} else {
?>
<form method="post">
<label for="city">Select your city</label>
<select name="city" id="city">
<option value="London">London</option>
<option value="Buenos Aires">Buenos Aires</option>
<option value="New York">New York</option>
<option value="Paris">Paris</option>
</select>
<input type="submit" value="Get your city's temperature">
</form>
<?php
}?>
</body>
</html>
これで、アプリケーションはユーザーのドロップダウン選択を表示するので、ユーザーは情報を取得する代わりに、情報を取得する都市を選択できます。 London
.
ただし、スクリプトで選択した都市をクエリするには、の最初の部分を変更する必要があります if
ステートメントも。 次のようにデータソースのURLを更新します。
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
?><h2><?php
$xml = new SimpleXMLElement('`https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=`'.$_POST['city'].'&appid=YOUR_API_KEY', 0, true);
echo $xml->temperature['value'];
?></h2>
<?php
} else {
?>
<form method="post">
<label for="city">Select your city</label>
<select name="city" id="city">
<option value="London">London</option>
<option value="Buenos Aires">Buenos Aires</option>
<option value="New York">New York</option>
<option value="Paris">Paris</option>
</select>
<input type="submit" value="Get your city's temperature">
</form>
<?php
}?>
</body>
</html>
ここでは、の値を変更しました q
からのパラメータ London
ユーザーが選択した都市へ。 URLは、次の連結として作成されます。
https://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric&q=
$_POST['city']
'&appid=YOUR_API_KEY'
完了したら、ファイルを保存して閉じます。
注:これは、OpenWeatherMapがパラメーターを処理する方法です。 他のAPIについては、詳細について特定のドキュメントを参照する必要があります。
変更を確認するには、ブラウザに戻ってナビゲーションを最初からやり直してください。 これで、都市を選択するためのドロップダウンがアプリに表示されます。
異なる都市を選択すると、異なる温度値が返されるはずです。
この手順では、アプリでユーザー入力を有効にし、データソースURLを更新して、ユーザーの選択に基づいてデータを取得しました。
ただし、この時点で、コードはAPIの応答の現在の構造と緊密に結合されており、将来にわたって利用できるとは限りません。 現在、を探すのは理にかなっています temperature
ルート要素の第1レベルの子としてタグを付けますが、これはいつでも変更される可能性があります。その場合、アプリケーションコードを更新して、機能を維持する必要があります。 この問題に対処する1つの方法は、ソフトウェア開発キット(SDK)を使用することです。これは、次のステップで実行します。
ステップ5—ソフトウェア開発キット(SDK)のインストール
このステップでは、 OpenWeatherMapPHPクライアントをインストールします。 このクライアントは、アプリケーションロジックをOpenWeather Mapサーバーとの通信方法の特定の詳細から完全に分離し、はるかに将来性のあるアプリケーションを効果的に生成します。 前の手順で行ったようにデータを手動で取得するのではなく、SDKを使用してデータを取得します。
アプリケーション内でSDKを使用すると、長期にわたってはるかに保守しやすくなります。 たとえば、サーバーがクライアントと対話する方法に変更が発生した場合、必要なのはユーザー側のSDKを更新することだけです。 比較すると、リクエストを自分でコーディングする場合、コードを適応させるには、すべてのリモート呼び出しを追跡して更新するために多大な労力が必要になります。 さらに、新しいバグが発生する可能性もあります。
OpenWeather Map PHP SDKを使用する最初のステップは、それをインストールすることです。 このチュートリアルでは、前提条件の一部としてインストールしたPHPの依存関係マネージャーであるComposerを使用します。
Composerを使用できるようになったら、次のコマンドを実行してSDKとその依存関係をインストールします。
- composer 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通信を処理するために必要な補助パッケージです。
これにより、次の出力が生成されます。
- Using version ^3.3 for cmfcmf/openweathermap-php-api
- ./composer.json has been created
- Running composer update cmfcmf/openweathermap-php-api http-interop/http-factory-guzzle php-http/guzzle6-adapter
- Loading composer repositories with package information
- Updating dependencies
- Lock file operations: 16 installs, 0 updates, 0 removals
- - Locking cmfcmf/openweathermap-php-api (v3.3.0)
- - Locking guzzlehttp/guzzle (6.5.5)
- - Locking guzzlehttp/promises (1.5.1)
- - Locking guzzlehttp/psr7 (1.8.3)
- - Locking http-interop/http-factory-guzzle (1.2.0)
- - Locking php-http/guzzle6-adapter (v2.0.2)
- - Locking php-http/httplug (2.2.0)
- - Locking php-http/promise (1.1.0)
- - Locking psr/cache (1.0.1)
- - Locking psr/http-client (1.0.1)
- - Locking psr/http-factory (1.0.1)
- - Locking psr/http-message (1.0.1)
- - Locking ralouphie/getallheaders (3.0.3)
- - Locking symfony/polyfill-intl-idn (v1.23.0)
- - Locking symfony/polyfill-intl-normalizer (v1.23.0)
- - Locking symfony/polyfill-php72 (v1.23.0)
- Writing lock file
- Installing dependencies from lock file (including require-dev)
- Package operations: 16 installs, 0 updates, 0 removals
- - Installing psr/http-message (1.0.1): Extracting archive
- - Installing psr/http-factory (1.0.1): Extracting archive
- - Installing psr/http-client (1.0.1): Extracting archive
- - Installing psr/cache (1.0.1): Extracting archive
- - Installing cmfcmf/openweathermap-php-api (v3.3.0): Extracting archive
- - Installing guzzlehttp/promises (1.5.1): Extracting archive
- - Installing ralouphie/getallheaders (3.0.3): Extracting archive
- - Installing guzzlehttp/psr7 (1.8.3): Extracting archive
- - Installing http-interop/http-factory-guzzle (1.2.0): Extracting archive
- - Installing php-http/promise (1.1.0): Extracting archive
- - Installing php-http/httplug (2.2.0): Extracting archive
- - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive
- - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
- - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive
- - Installing guzzlehttp/guzzle (6.5.5): Extracting archive
- - Installing php-http/guzzle6-adapter (v2.0.2): Extracting archive
- 2 package suggestions were added by new dependencies, use `composer suggest` to see details.
- Generating autoload files
- 6 packages you are using are looking for funding.
- Use the `composer fund` command to find out more!
これで、プロジェクト内に新しいディレクトリができました。 vendor
. このディレクトリは、Composerを介してインストールされたすべての依存関係が見つかる場所です。
ライブラリコードと一緒に、それらすべてへのアクセスを提供するファイルがあります。 autoload.php
. 持ち込んだ依存関係のいずれかを使用する必要があるすべてのスクリプトの先頭に、このファイルを含める必要があります。
このステップでは、アプリケーションに新しい依存関係を追加しました。OpenWeatherMapAPIのオブジェクト指向クライアントです。 これに依存することで、はるかにクリーンなコーディングインターフェイスが得られ、APIの新しいバージョンに一致するようにコードを更新する全体的な労力を軽減できます。
ステップ6—SDKを使用してWebアプリをリファクタリングする
このステップでは、前のステップでインストールしたSDKを使用するようにコードをリファクタリングします。 スクリプトにSDKコードが必要であり、ライブラリ内で提供されているオブジェクトを使用してリモートAPIにアクセスします。
開ける index.php
次のように編集および更新します。
<?php
use Cmfcmf\OpenWeatherMap;
use Cmfcmf\OpenWeatherMap\Exception as OWMException;
use Http\Factory\Guzzle\RequestFactory;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;
?>
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
require_once 'vendor/autoload.php';
$city = $_POST['city'];
$owm = new OpenWeatherMap('YOUR_API_KEY', GuzzleAdapter::createWithConfig([]), new RequestFactory());
try {
$weather = $owm->getWeather($city, 'metric', 'en');
?><h2><?php echo $weather->temperature; ?></h2>
<?php
} catch(OWMException $e) {
echo 'OpenWeatherMap exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
} catch(\Exception $e) {
echo 'General exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
}
} else {
?>
<form method="post">
<label for="city">Select your city</label>
<select name="city" id="city">
<option value="London">London</option>
<option value="Buenos Aires">Buenos Aires</option>
<option value="New York">New York</option>
<option value="Paris">Paris</option>
</select>
<input type="submit" value="Get your city's temperature">
</form>
<?php
}?>
</body>
</html>
交換することを忘れないでください YOUR_API_KEY
APIキーの実際の値を使用します。
上部に名前空間を宣言することから始めます(use ...
ステートメント)。 これらの行を使用して、短いクラス名を完全に分類された名前にマップする方法をインタプリタに指示します(たとえば、 OpenWeatherMap
に Cmfcmf\OpenWeatherMap
)、コードの読み取りと書き込みを容易にします。
また、 vendor/autoload.php
ファイル。 このファイルはによって作成されました composer
また、 spl_autoload_register への必要な呼び出しが含まれているため、スクリプトで明示的に必要とされないクラスの新しいインスタンスを作成できます。
最も重要な変更は、メソッドを使用することです(getWeather
)リモートサーバーを呼び出して、コードをクリーンに保ち、長期にわたって保守しやすくします。 HTTP呼び出しを行い、テキストをPHPオブジェクトに変換します。 ある意味で、リモートコールが行われていることを忘れて、天気情報に直接アクセスしたかのように機能することができます。 また、サーバーからの応答が変更された場合は、APIの呼び出しが行われるコードのすべてのインスタンスを変更するのではなく、SDKのバージョンを更新するだけです。
次に、例外をキャッチするように変更しました。 外部システムを扱うときは、リモートサーバーが応答しなくなったり、ローカルネットワークに障害が発生したりするなどの問題を予測することをお勧めします。 例外をキャッチしていない場合、例外が発生すると、不快なユーザーエクスペリエンスが発生し、スクリプトの実行が予期せず停止するため、システムの安定性が損なわれる可能性があります。
ここに2つあります catch
デバッグを容易にするためのこのスクリプトのステートメント。 方法以来 OpenWeatherMap::getWeather
特定の例外をスローします(OWMException
)、それらを使用して別のものを残すことは理にかなっています catch-all
不明なものがある場合に備えて、例外ハンドラー。
完了したら、ファイルを保存して閉じます。
ページを更新すると、出力にわずかな変化が見られます。
これで、摂氏記号が温度の横に表示されます。
これは、アプリケーションが現在使用しているために発生します echo $weather->temperature;
その出力を生成し、 $weather->temperature
のオブジェクトです Cmfcmf\OpenWeatherMap\Util\Temperature
クラス、を実装します __toString
戻り値に単位を含めるメソッド。 前の手順と同じ出力を取得したい場合は、次を使用できます。 echo $weather->temperature->getValue()
代わりは。
このステップでは、既存のSDKを利用して低レベルの通信の詳細を抽象化することにより、アプリケーションの保守をはるかに簡単にしました。
アプリケーションを本番環境に対応させるための最後のステップは1つだけです。それは、ハードコードされたものを削除することです。 API_KEY
. キーがハードコードされたままの場合、アプリケーションを別の環境にデプロイするたびに、コードを機能させるためにコードにアクセスする必要があります。これはエラーの原因です。
手順7—ハードコーディングを削除する
これまで、ハードコードされたデータの一部であるOpenWeatherAPIキーを使用してきました。 ハードコードされた情報を削除すると、アプリケーションをさまざまな環境で実行できるようになります。これは、複数の実行コンテキスト(dev、test、prodなど)が必要な実際のアプリケーションにとって重要な機能です。
このステップでは、ハードコードされたAPIキーを削除して、さまざまな環境にデプロイするためのアプリケーションを準備します。
1つの手法は、この種の情報を環境変数に格納することです。環境変数は、PHPスクリプト内で $_ENV
配列。
このアプローチを使用するには、 index.php
強調表示された部分を編集および更新するためのファイル:
<?php
use Cmfcmf\OpenWeatherMap;
use Cmfcmf\OpenWeatherMap\Exception as OWMException;
use Http\Factory\Guzzle\RequestFactory;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;
?>
<html>
<body>
<h1>Weather query</h1>
<?php
if ( 'post' === strtolower($_SERVER['REQUEST_METHOD'])) {
require_once 'vendor/autoload.php';
$city = $_POST['city'];
$owm = new OpenWeatherMap($_ENV['API_KEY'], GuzzleAdapter::createWithConfig([]), new RequestFactory());
try {
$weather = $owm->getWeather($city, 'metric', 'en');
?><h2><?php echo $weather->temperature; ?></h2>
<?php
} catch(OWMException $e) {
echo 'OpenWeatherMap exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
} catch(\Exception $e) {
echo 'General exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').';
}
} else {
?>
<form method="post">
<label for="city">Select your city</label>
<select name="city" id="city">
<option value="London">London</option>
<option value="Buenos Aires">Buenos Aires</option>
<option value="New York">New York</option>
<option value="Paris">Paris</option>
</select>
<input type="submit" value="Get your city's temperature">
</form>
<?php
}?>
</body>
</html>
完了したら、ファイルを保存して閉じます。
変更を有効にするには、ローカルWebサーバーを停止し、次のコマンドを使用して再起動する必要があります。
- API_KEY=YOUR_API_KEY php -d variables_order=EGPCS -S localhost:8707
交換 YOUR_API_KEY
APIキーの実際の値を使用します。
この呼び出しでは、最初に環境変数の値を確立してから、PHPインタープリターを呼び出します。 オペレーティングシステムは、APIキー定義を含むPHPプロセスの新しい実行環境を作成します。
The -d
修飾子が適用されます php
コマンドであり、PHPの構成を変更するために使用されます。 この場合、 variables_order
定義は、スーパーグローバルがどのように設定されるかを確立します。 値 EGPCS
環境、取得、投稿、Cookie、サーバーを意味します。 このの詳細については、PHPのドキュメントを参照してください。
実稼働環境の場合、Webサーバー構成を使用してこれらの値を確立できます。
この手順では、APIキーのハードコーディングを削除し、代わりに環境変数を使用しました。 これで、アプリケーションはさまざまな環境での実行により適したものになります。
結論
この記事では、ユーザーがOpenWeather Mapにクエリを実行して、選択した都市の現在の気温を取得できるWebアプリケーションを作成しました。 を使用してリモートRESTfulAPIからデータを取得しました file_get_contents
およびを使用して解析されたXMLデータ SimpleXMLElement
. また、利用可能な場合は、SDKを使用してリモートAPIにアクセスしました。 最後に、アプリケーションを更新して、環境変数をハードコーディングする代わりに、環境変数からシークレットを取得しました。
次のステップとして、より複雑なAPIに進み、基本的な原則がどのように同じであるかを確認できます。
存在するAPIタイプはRESTfulAPIだけではないことに注意してください。 SOAP は非常に異なるプロトコルであり、多くのシナリオ、特に政府機関でまだ使用されているため、他のAPIタイプについても理解しておくことをお勧めします。