OpenWetherのAPIを使って天気情報を取得する
目次
はじめに
本記事では、OpenWetherのAPIを使って世界の天気情報を取得する方法について説明していきます。正確には、実際に手を動かしながらやってみます。
OpenWetherのWebサイトはこちら:
https://openweathermap.org
実施したこと
OpenWetherの登録とAPI Keyの取得
APIを利用するにはAPI Keyが必要とのことなので、登録していきます。
https://home.openweathermap.org/users/sign_up
こちらからユーザー名、パスワードを設定していきます。
設定したEmailの確認メールが飛びますので、Verifyしておきましょう。
登録が完了したらAPI keysのページに移動します。
デフォルトで1つKeyが用意されていますが、将来的に用途で分ける可能性を考えて、新しくKeyを作成し、デフォルトのKeyはde-activateしておきました。以下の赤枠が今回のAPI Keyになります。
Next.js環境にMaterial UI環境を用意
Material UIというGoogle提供のUIを使用してみたかったのでインストール。
npm install @mui/material @emotion/react @emotion/styled @mui/material-nextjs @emotion/cache
これでGoogleライクなUIのボタンやフォームの使用が可能になります。
Weather APIのテスト
Weather APIはおそらく初心者向けなのでしょうか。。色んな方がTypescriptのコードを実際にWeb上に参考としておいてくれていますので、そちらを参考に。
都市名を指定して直接その土地の天気を取得する方法が見つからなかったため、都市名から緯度(lat)と経度(lon)を取得するGEO APIをコールした後、DATA APIにてその土地の天気情報を取得しました。
以下が実際のコードとなります…が、初心者なのでコードが汚い等はご勘弁下さい。
// get GEO location
const res1 = await fetch(`https://api.openweathermap.org/geo/1.0/direct?q=${city}&limit_1&appid=${process.env.NEXT_PUBLIC_WEATHER_API_KEY_GEO}`);
const data1 = await res1.json();
// For debug
// console.log(data1[0].name);
// console.log(data1[0].lat);
// console.log(data1[0].lon);
// get weather info from GEO location
const res2 = await fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${data1[0].lat}&lon=${data1[0].lon}&appid=${process.env.NEXT_PUBLIC_WEATHER_API_KEY_WET}`);
const data2 = await res2.json();
// For debug
// console.log(data2);
NEXT_PUBLIC_WEATHER_API_KEY_GEOとNEXT_PUBLIC_WEATHER_API_KEY_WETは実際のKey情報となりますが、env.localファイルに環境変数として設定しています。
でもコレ、開発者ツール上はアクセスしているURLに埋め込まれて見えちゃっているように見えるんですよね。。どうするかは少し悩みます。
UIの設計
何が出来れば良いかと言えば、都市名を入力すればその都市の天気情報が表示出来れば良い、というものであったので、表示に関しては以下のコードを作成しました。
return (
<div className={styles.body}>
<Stack height="100lvh" justifyContent="center" alignItems="center" gap="32px">
<Typography id="input_variant" variant="h1" fontSize="1.5rem">Please fill in City Name.</Typography>
<Stack component="form" width={560} gap="24px" aria-labelledby="login_heading">
<TextField label="City Name" onChange={(e) => {
setCity(e.target.value);
}}/>
<Button variant="contained" onClick={getWeather}>結果表示</Button>
<Typography id="result_city" variant="h1" fontSize="1.5rem">City: {city}</Typography>
<Typography id="result_weather" variant="h1" fontSize="1.5rem">Weather: {weather}</Typography>
</Stack>
</Stack>
</div>
);
ここでも少し、いやかなりデザインの勉強は必要ですね。。
動作の確認
実際にローカル環境で動作させた結果がこちら。
Londonと入力して、結果を表示ボタンを押せば…
Osakaと入力して、結果を表示ボタンを押せば…
動作していそうです!
さいごに
本記事では、ブラウザのUIから指定した都市の天気情報を取得するための手順を記載致しました。知らない技術ばかりで迷走しておりますが、少しずつ、素晴らしいものを作り上げたいと思っています。
何かご不明点がありましたらお気軽にお問合せ下さい。また、当方がTypescriptやWebアプリケーションにおいて初心者ですので、ご指摘・アドバイスについてもお待ちしております。
それではまた。
ディスカッション
コメント一覧
まだ、コメントがありません