Ajaxで天気を表示する(API)
この記事でわかること
- APIの取得方法
- Ajaxについて
前提条件
- jQueryの導入済み
導入方法は以下の記事で解説
よろしくお願いします。
APIとは
APIは、データの共有や機能の利用を可能にし、異なるアプリケーションが協力して動作できるようにします。簡単に言えば、APIはプログラム同士のコミュニケーションを可能にします。
例えば、LINEでChatGPTを使えるサービスを作りたいならば、LINEでChatGPTのAPIを取得することで実現できます。
Ajaxとは
例えば「X(Twitter)」でフォロワーのツイートを「いいね」したとしましょう。このとき、「X」を開くときのような通信は発生せず、ハートマークだけが変化すると思います。
このようにページを更新ぜずとも、リアルタイムでデータを読み込めるようにするために使用します。またAjaxはJavaScriptを使って動き、データはXMLまたはJSON形式で受け渡されます。
【Ajaxの動き】
- クライアントでイベントが発生します。(ex: ボタンクリック)
- クライアントはサーバに非同期リクエストを送ります。
- サーバはリクエストを処理し、結果をJSON形式で返します。
- クライアントは結果を受け取り、ページを動的に更新します。
実装手順
実装手順は以下の手順で行います。
- APIの登録
- Viewの作成
- JS(Ajax)の作成
実装方法
APIの登録
以下のサイトにアクセスしてアカウントを作成します。
メール認証を終えたら完了です。
Viewの作成
今記事で実装する背景は以下の通りです。
- railsでの実装
- deviceが実装済み
- jQueryがインストール、設定済み
表示させたいViewに以下のコードを記述します。
<h1>ようこそ<%= @user.name %>さん</h1>
<h3>日本の天気</h3>
<label>都市名:</label>
<input id="cityname" type="text" size="14" maxlength="14" placeholder="Tokyo">
<button id="btn">検索</button><br>
<span>場所 :</span>
<span id="place"></span><br>
<span>最高気温 :</span>
<span id="temp_max"></span>
<span> ℃</span><br>
<span>最低気温 :</span>
<span id="temp_min"></span>
<span> ℃</span><br>
<span>湿度 :</span>
<span id="humidity"></span>
<span> %</span><br>
<span>風速 :</span>
<span id="speed"></span>
<span> m/s</span><br>
<span>天気 :</span>
<span id="weather"></span>
<div id="icon"><img id="img"></div>
解説(idの設定について)
このIDの名前や設定は以下が理由です。
(https://api.openweathermap.org/data/2.5/weather?q=tokyo&units=metric&appid=取得したAPIキー)で検索します。
{"temp":18.6,"feels_like":17.85,"temp_min":17.01,"temp_max":19.79,"pressure":1019,"humidity":51},"visibility":10000,"wind":
上記は検索結果の一部を抜粋したものです。上記を確認すると("temp_max":19.79)と表示されています。これは最高気温が19.79という意味で、これをID設定して自身のブラウザに反映させます。
"temp_max":19.79の記載を反映
<span>最高気温 :</span>
<span id="temp_max"></span>
この作業を全項目繰り返したものが完成したコードです。
JS(Ajax)の作成
今回はAjaxのコードは、先程のViewファイルと同じファイルに記述しました。
<h1>ようこそ<%= @user.name %>さん</h1>
## 天気のView
<script>
const API_KEY = "取得したAPIキー";
$(function(){
$('#btn').on('click', function() {
// 入力された都市名でWebAPIに天気情報をリクエスト
$.ajax({
url: "https://api.openweathermap.org/data/2.5/weather?q=" + $('#cityname').val() + "&units=metric&appid=" + API_KEY,
dataType : 'jsonp',
}).done(function (data){
//通信成功
// 位置
$('#place').text(data.name);
// 最高気温
$('#temp_max').text(data.main.temp_max);
// 最低気温
$('#temp_min').text(data.main.temp_min);
//湿度
$('#humidity').text(data.main.humidity);
//風速
$('#speed').text(data.wind.speed);
// 天気
$('#weather').text(data.weather[0].main);
// 天気アイコン
$('img').attr("src","http://openweathermap.org/img/w/" + data.weather[0].icon + ".png");
$('img').attr("alt",data.weather[0].main);
}).fail(function (data) {
//通信失敗
alert('通信に失敗しました。'); });
});
});
</script>
解説
$(function(){
$('#btn').on('click', function() {
btnIDで設定した検索をクリックすると以下の処理をしてください
$.ajax({
url: "https://api.openweathermap.org/data/2.5/weather?q=" + $('#cityname').val() + "&units=metric&appid=" + API_KEY,
dataType : 'jsonp',
$.ajaxでjQueryを介してAjaxのリクエストを行います。
url プロパティは、OpenWeatherMap APIに向けたリクエストのURLを指定します。
$('#cityname').val()は、idが "cityname" のHTML要素からユーザーが入力した都市名を取得します。
url プロパティは、OpenWeatherMap APIに向けたリクエストのURLを指定します。$('#cityname').val()は、idが "cityname" のHTML要素からユーザーが入力した都市名を取得します。そして、API_KEYはOpenWeatherMapのAPIキーです。ここでは、都市名、温度単位(摂氏)、およびAPIキーをURLに結合しています。
dataType プロパティは、Ajaxリクエストで受信するデータの形式を指定します。ここでは 'jsonp' と指定されており、JSONPというデータ形式を指定しています。JSONPはクロスドメインリクエストの一種で、異なるドメインからデータを取得できるようにするための手法です。
このコードは、ユーザーが入力した都市名を含むURLを作成し、OpenWeatherMap APIに対してリクエストを送信し、APIからの応答を受け取るためのものです。リクエストが成功すると、APIからの天気情報が取得され、その情報を使用してWebページ上に表示できます。
dataTypeでは、レスポンスとして取得したいデータの型を指定します。今回はJSONで受け取りたいので、 dataType : 'jsonp',と記述します。
.done(function (data){
.fail(function (data) {
上記は通信が成功した場合と失敗した場合で、処理内容を場合わけしています。
dataTypeプロパティ(種類)
'json': サーバーからのレスポンスがJSON形式である場合に適しています。JSONデータはJavaScriptオブジェクトに変換されます。
'xml': サーバーからのレスポンスがXML形式である場合に適しています。XMLデータはパースされます。
'html':サーバーからのレスポンスがHTMLである場合に適しています。
'text': サーバーからのレスポンスがプレーンテキストである場合に適しています。
'script': これは、JavaScriptコードを含むレスポンスを受信するために使用されます。外部のJavaScriptファイルをロードしたり、動的に実行したりするのに役立ちます。
まとめ
以上で今記事を終了します。Ajaxの知識を深められて楽しかったです。
Discussion