【ワンピースで覚えるJavaScript】第35回 fetch API・非同期通信(プログラミング入門講座)
Javascriptで、fetch APIの使い方を説明します。
難しい感じがしますが、書き方は決まっているので、慣れてしまえば簡単です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<link rel="stylesheet" media="screen" href="style.css">
</head>
<body>
<h1>fetch(非同期通信)</h1>
<button id="btn1" class="btn btn-info mb-3">
ルフィ
</button>
<p id="result"></p>
<h1>fetch(通信エラー)</h1>
<button id="btn2" class="btn btn-info mb-3">
ウソップ
</button>
<p id="result2"></p>
<h1>fetch(クエリ情報)</h1>
<form>
<label for="name" class="form-label d-block">
好きなキャラクター
</label>
<input type="text" name="name"
class="form-control w-50 d-inline" id="name"
autocomplete="off">
<input id="btn3" type="button"
class="btn btn-primary" value="送信">
</form>
<p id="result3"></p>
<h1>fetch(POST)</h1>
<form id="formdata">
<label for="devil_fruit"
class="form-label d-block">悪魔の実</label>
<input type="text" name="devil_fruit"
class="form-control w-50 d-inline"
autocomplete="off">
<input id="btn4" type="button"
class="btn btn-primary" value="食べる">
</form>
<p id="result4"></p>
<h1>fetch(JSON形式)</h1>
<button id="btn5" class="btn btn-info mb-3">
チョッパーとは
</button>
<p id="result5"></p>
<script src="index.js"></script>
</body>
</html>
//fetchメソッドは引数で指定したURLに対して、HTTPリクエストを行う
let btn1 = document.getElementById("btn1");
btn1.addEventListener("click", () => {
console.log(fetch("luffy.php"));
//fetchメソッドはResponseオブジェクトを結果に持つPromiseを返す
//Promise 非同期処理の「状態」と「結果」を表すオブジェクト
//Promiseの状態がfulfilledかrejectedの時に
//thenの引数のコールバック関数が実行される
fetch("luffy.php") //非同期通信開始
.then(function(response){
console.log(response);
return response.text(); //レスポンスの形式に応じて取り出す
}).then(function(data){ //ページに反映
document.getElementById("result").textContent = data;
})
});
//通信エラー
let btn2 = document.getElementById("btn2");
let result2 = document.getElementById("result2");
btn2.addEventListener("click", () => {
fetch("usopp.php")
.then(function (response) {
if (response.ok) {
console.log(response);
return response.text();
}
throw new Error("うそだよー");//例外を投げる
}).then(function (data) {
result2.textContent = data;
}).catch(function(error){//エラーを処理
result2.textContent = error;
})
});
//クエリパラメータ
let btn3 = document.getElementById("btn3");
let result3 = document.getElementById("result3");
let chara_name = document.getElementById("name");
btn3.addEventListener("click", () => {
//JavaScriptを用いてURLにクエリを入れる方法
let params = new URLSearchParams();
console.log(params);
//キーと値をパラメータに設定
params.set("name", chara_name.value );
//クエリパラメータを返す(文字を自動的にエスケープ)
console.log(params.toString());
fetch("chara.php?" + params.toString())
.then(function (response) {
return response.text();
}).then(function (data) {
result3.textContent = data;
})
});
//POSTデータを送信
let btn4 = document.getElementById("btn4");
let result4 = document.getElementById("result4");
let formdata = document.getElementById("formdata");
btn4.addEventListener("click", () => {
//FormDataオブジェクトとは、
//サーバーにデータを送信する際に使用するオブジェクト
let data = new FormData(formdata);
/* let formData = new FormData();
formData.append("キー", "値"); */
console.log([...data]);
fetch("devil.php", {
method: "POST",
body: data,
})
.then(function (response) {
return response.text();
}).then(function (data) {
result4.textContent = data;
})
});
//JSON形式のPOSTデータを送信
let btn5 = document.getElementById("btn5");
let result5 = document.getElementById("result5");
let info = {
devil_fruit: "ヒトヒトの実",
bounty: 1000
};
btn5.addEventListener("click", () => {
//JSON形式に変換
console.log(JSON.stringify(info));
fetch("chopper.php", {
method: "POST",
headers: { //デフォルトtext/plain(テキストファイル)
"content-type": "application/json",
},
body: JSON.stringify(info),
})
.then(function (response) {
return response.text();
}).then(function (data) {
result5.textContent = data;
})
});
<?php
$luffy = "海賊王になる男";
print($luffy);
<?php
$name = htmlspecialchars(
$_GET['name'],
ENT_QUOTES,
"UTF-8"
);
print("私が好きなのは".$name."です");
<?php
$devil_fruit = htmlspecialchars(
$_POST['devil_fruit'],
ENT_QUOTES,
"UTF-8"
);
print("私は「".$devil_fruit."」の能力者");
<?php
//コンテンツタイプが application/jsonのときは$_POSTを避ける
//php://input から生のデータを引っ張り出す
//php://input => 送信されたbody部
//file_get_contents => データ部の文字列化(JSON)
//json_decode => オブジェクトに変換
$data = json_decode(file_get_contents("php://input"));
//クラスオブジェクトとして変換するので値を取り扱う際アロー演算子
print($data->devil_fruit."の能力者で、懸賞金は"
.$data->bounty."ベリー");
//連想配列としてデコードしたい場合は
//json_decode(file_get_contents("php://input"), true);
この記事が気に入ったらサポートをしてみませんか?