ネットで公開されているサンプルを試す
ゼロからはじめるJavaScript(8) ブラウザのFetch APIで天気情報を取得してみよう | TECH+
https://news.mynavi.jp/techplus/article/zerojavascript-8/
上記記事で公開されているサンプルが、Fetch APIの使い方としてはわかりやすいと思います。
JSONファイルを読むように変更
「天気APIにアクセス」の部分を、こちらで用意したJSONファイルを読むように変更します
<DOCTYPE html>
<meta cahrset="utf-8">
<script>
// 天気APIにアクセス --- (*1)
const api = 'https://ex.example.com/api/tenki319.json'
fetch(api)
.then(res => res.json())
.then(data => tenki(data))
// 結果を表示 --- (*2)
function tenki(data) {
let s = ''
const tokyo = data[319] // 東京の情報 --- (*3)
// 1日ずつのデータを表示 --- (*4)
for (let row of tokyo) {
console.log(row) // デバッグ表示
s += `
<h3>${row['date']}の天気</h3>
<ul><li>${row['forecast']}</li>
<li>降水確率: ${row['poptimes']}%</li></ul>
`
}
document.write(s)
}
// via https://news.mynavi.jp/techplus/article/zerojavascript-8/
</script>
↑ HTMLファイル
↓ JSONファイル
{
"mkdate": "2022\/07\/24 14:50:39",
"319": [
{
"date": "24日(日)",
"forecast": "晴時々曇",
"mintemp": "33",
"maxtemp": "33",
"poptimes": "-\/-\/10",
"waves": "1メートル",
"winds": "南の風 23区西部 では 南の風 やや強く",
"weathers": "晴れ 時々 くもり"
},
{
"date": "25日(月)",
"forecast": "晴時々曇",
"mintemp": "25",
"maxtemp": "25",
"poptimes": "-\/-\/10",
"waves": "0.5メートル 後 1メートル",
"winds": "南の風 23区西部 では 南の風 やや強く",
"weathers": "晴れ 朝晩 くもり"
},
{
"date": "26日(火)",
"forecast": "曇",
"mintemp": "26",
"maxtemp": "33",
"poptimes": "-\/-\/-",
"waves": "1メートル",
"winds": "南の風 やや強く",
"weathers": "くもり"
},
{
"date": "27日(水)",
"forecast": "曇一時雨",
"mintemp": "26",
"maxtemp": "31",
"poptimes": "-\/-\/-",
"waves": "-",
"winds": "-",
"weathers": "-"
}
]
}
JSONファイルは、「tenki319.json」という名前で、https://ex.example.com/api/ に配置(転送)してください。
実行するとこんな感じになるかと思います。
blocked by CORS policy エラー
レンタルサーバーの環境によっては、動作しない場合があります。
動作しない場合は、ブラウザーの開発者ツール(F12)を開いて、コンソールを確認してみてください
02.html:1
Access to fetch at ‘https://ex.example.com/api/tenki319.json’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.ex.example.com/api/tenki319.json:1
Failed to load resource: net::ERR_FAILED02.html:7
Uncaught (in promise) TypeError: Failed to fetch
at 02.html:7:1
blocked by CORS policy エラーが出てる場合は、以下の方法で動作するようになるかと思います。
Header set Access-Control-Allow-Origin "*"
.htaccessに上記1行を追記して、JSONファイルと同じ場所に配置してください。
人気記事一覧を作成する
<DOCTYPE html>
<meta cahrset="utf-8">
<script>
window.addEventListener('DOMContentLoaded', () => {
const api = 'https://ex.example.com/api/popular-posts.json';
fetch(api, {method: 'GET'})
.then((res) => {
console.log( res );
return res.json();
})
.then((data) => {
disp(data);
})
.catch((err) => {
console.error( err );
});
function disp(data) {
let s = '';
const posts = data["popular"] ;
for (let row of posts) {
s += `
<h3>${row['title']}</h3>
<p>${row['url']}</p>
<p><img src="${row['img_url']}" ></p>
`;
}
s = '<div class="ccard list-group">' + s + '</div>';
var element = document.getElementById("popular-posts");
element.insertAdjacentHTML('beforeend',s);
}
});
</script>
ここに表示される
<div id="popular-posts"></div>
↑ HTMLファイル
↓ JSONファイル
{"popular":[
{"url":"https://blog2.k05.biz/2016/05/netsu-tube.html",
"title":"ダイソーで、熱収縮チューブを購入した",
"img_url":"https://1.bp.blogspot.com/-XvxDQ18gYUE/V0aT5MHaM5I/AAAAAAAAgZI/uIHelfH-8Ic_jU7itn8hB21Vj1FJaQjlwCKgB/s150-c/netsu-tube01.jpg"},
{"url":"https://blog2.k05.biz/2020/01/leather-sticker-patch.html",
"title":"【100均】合皮シールで補修してみる",
"img_url":"https://1.bp.blogspot.com/-YY12W2SopwQ/XigBFe6MpzI/AAAAAAAAwxs/aFI7o_KkJOUL7Da_KQHR3YlS4N88UyXqQCKgBGAsYHg/s150-c/leather-sticker-patch01.jpg"},
{"url":"https://blog2.k05.biz/2013/07/petbottle-jositu.html",
"title":"凍ったペットボトルで、除湿する方法 【扇風機併用で簡易クーラー?!】",
"img_url":"https://1.bp.blogspot.com/-Q5-s-JYINPA/Vd8-2PNTGCI/AAAAAAAAYeo/HiShmf7EY3I/s150-c/petbottle-jositu01.jpg"},
{"url":"https://blog2.k05.biz/2013/05/sudare.html",
"title":"すだれが取付できないサッシの場合・・・",
"img_url":"https://2.bp.blogspot.com/-5JMguTZrML8/VeHPmWMhZaI/AAAAAAAAZ8c/sJMahyFI2yE/s150-c/sudare101.jpg"},
{"url":"https://blog2.k05.biz/2022/04/povo-180days-topping.html",
"title":"【povo2.0】180日が経過した。通話トッピング購入。",
"img_url":"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSPgsrfE7GWN6pgpVWSPhxz2ULpBrgAc2bSrB2zE6obwQHTIbKNd8IJtnZPS4eX63lQ5I0t8Bhy72JIJkXVWLG0bR1ctf-kr018WZiKQOVlDAv_snR4lZMzwsOulALqD_rJQUD_F3Yo2IgqaRcP3lffZKHWXYzsiyTYGHCWOJuBFX8wSBtf7V8VtyX-Q/s150-c-rw/povo-180days-topping01.webp"}
]}
JSONファイルは、「popular-posts.json」という名前で、https://ex.example.com/api/ に配置(転送)してください。
実行すると、このように表示されます。
PHPでJSONファイルを作成
//------------------------
// json出力
//-------------------------
$data = array("popular" =>$popular);
$json=json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
$f = "./api/popular-posts.json";
file_put_contents($f,$json);
json_encode を使うと簡単です。フラグには、JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHESを指定するとよいかも。
連想配列をjson_encodeでJSONデータにしてくれます。
※注意
人気記事一覧の連想配列を作成する部分は、上記のソースコードには含まれてません
ブログパーツ化
・CRONで1日1回、Google Analytics Reporting API をつかってPHPで、popular-posts.jsonファイルを作成
・Wordpressのウィジェットで、Fetch APIを用いて、popular-posts.jsonファイルを読み込む
こんな感じで、かなり簡単に作成できます。