JavaScript / 操作 / ネットワーク / fetch

JavaScript / 操作 / ネットワーク / fetch

コピペで使える fetch

fetch 関数は通信の基本なのだが Promise やらなんやらの知識が必要になるので非プログラマには敷居が高い。 そういう人たち向けに脳みそを使わないでコピペで使えるようにしておく。

このような感じになる。

async function fetchHoge(v){
    var url = 'https://example.com/api/v123/hoge/' + v + '?apiKey=xxxxxxxxxxx', {
    let res = await fetch(url, {
        method: 'GET',
        mode: 'cors'
    });
    if (res.status === 200) {
        return await res.json(); // => "OK"
    }else{
        console.log(await(res.statusText)); // => Error Message
    }
}

こいつをこのように使うと結果の JSON を元にしたオブジェクトが戻ってくる

var hogeResult = await fetchHoge(42);

この async がつけられて作られた関数 return する結果を戻す Promise というモノをを返す非同期処理の関数となる。 この時点で難しい。

この関数を await 付きで実行すると非同期処理の終了を同期(待ってくれる)してくれて、 しかもその戻りは async の関数が return している内容そのものになる。

この await の関数実行記述には制約もあって、await 実行は async 宣言されている関数内でしかできない。

同期処理

この fetch というメソッドには同期的処理をするオプションは無い。

なので、使うには Promise による非同期処理の知識が必須になる。

method の指定を大文字に

method の指定はデフォルトで GET になっているようで、get と間違えても通じてしまうようだが、 PATCH を patch と書くと通用しない場合がある。

GET

パラメータに使う QueryString を生成する

const params = new URLSearchParams({
    "hoge": "ほげ",
    "piyo": "ぴよ",
    "fuga": "ふが"
});
console.log(params.toString());

↑のやりかたはわかりやすいが、同一キー名の複数パラメータができないので、↓このように書ける。

const params = new URLSearchParams();
params.append("hoge": "ほげ1");
params.append("hoge": "ほげ2");
params.append("piyo": "ぴよ");
params.append("fuga": "ふが");
console.log(params.toString());

POST

const response = await fetch(
        "https://hogehoge.example.com/abc",
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: '{"name":"hogehoge", "age":20}'
        }
);
const result = await response.json();
console.log(result);

CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない

とかいうエラーが console に出る。本当にサーバ側が許可してなくて CORS できない可能性もある。

しかし、エンドポイント(対象のURL)の指定をミスっていて、そもそも対象の URL じゃないから出ている可能性もある。

javascript/ope/network/fetch.txt · 最終更新: by ore