1. id が無ければ新規作成として POST になる
  2. id があれば更新として PUT になる
  3. 配列を含む作品でも body が文字列になる
  4. title が空文字なら組み立てない
  5. work が null なら組み立てない
コース一覧
非同期JavaScript:API通信とモジュール
POST のリクエストを組み立てる

非同期JavaScript:API通信とモジュール

Promise と async/await、非同期エラー、HTTP/REST、fetch による GET、読み込み・成功・失敗の表示、モジュールの読み方を学ぶ全 19 レッスン(380 分)のコースです。最後は承認済みの読み取り専用 API から作品データを取得して表示します。POST はリクエストの組み立てまでで、外部サービスへの書き込みは行いません。

1
非同期処理
01. 同期と非同期15分
02. Promise をつくって返す20分
03. async と await20分
04. Promise.all で同時に待つ20分
05. 非同期のエラーを捕まえる20分
06. つくる 読み込み中の表示を出す30分
07. 第1章まとめクイズ10分
2
fetch で外のデータを使う
01. HTTP と REST の読みかた15分
02. fetch でデータを取る25分
03. 取ったデータを描画する25分
04. response.ok と失敗時の表示25分
05. POST のリクエストを組み立てる20分
06. つくる 作品データを API から読む30分
07. 第2章まとめクイズ10分
3
モジュールと総仕上げ
01. ファイルを分けるという考えかた15分
02. named export と default export15分
03. つくる ポートフォリオアプリを仕上げる40分
04. ここから先の学びかた15分
05. 第3章まとめクイズ10分

POST のリクエストを組み立てる

POST のリクエストの3点セット
解説

このレッスンで分かること

  • fetch の第 2 引数に method と headers と body を組み立てます
  • 新しく作るのか、すでにあるものを直すのかで、送り先が変わります

送ったのに、中身が [object Object] で届く

データを送るときにいちばん多い事故がこれです。body にオブジェクトをそのまま入れると、文字列に変換されて 15 文字だけが相手に届きます。

JavaScript

const comment = { body: "はじめまして", year: 2026 }; console.log(String(comment)); // [object Object] console.log(JSON.stringify(comment)); // {"body":"はじめまして","year":2026} console.log(typeof JSON.stringify(comment)); // string

JSON.stringify はオブジェクトを JSON の文字列に変えます。受け取ったサーバー側は、この文字列を JSON として読み直します。取ってくるときに使った response.json() と対になっていて、送るときに文字列へ畳み、受け取るときに文字列から戻しているだけです。

解説

このコースでは、実際に送信するところは扱いません。教材から本物の書き込みを飛ばすと、課題を解くたびにどこかのサーバーのデータが増えていくことになるからです。練習用の口も読み取り専用にしてあります。ここでやるのは、送る直前までの組み立てです。実務で詰まるのもほとんどこの部分で、組み立てさえ間違えなければ、送信そのものは 1 行足すだけです。

3 点セットで、どう送るかを決める

fetch は 2 つ目の引数にオブジェクトを取ります。ここに送りかたを書きます。

JavaScript

const options = { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(comment) };
項目何を決めるか書き忘れるとどうなるか
method取るのか作るのか消すのかGET として送られ、本文が捨てられる
headers本文の形式は何かサーバーが JSON として読んでくれない
body送る中身そのもの中身のないリクエストになる

headers の役割は名乗ることです。文字列の形と、それを何として読むかの宣言は、両方そろって初めて意味を持ちます。取ってくるだけの GET なら、第 2 引数ごと省けます。送る中身が無いからです。

新しく作るのか、直すのかで送り先が変わる

URL は名詞で、したいことはメソッドで表す。この決めかたがそのまま効いてきます。同じ「保存する」でも、新しく作るのか、すでにあるものを直すのかで送り先もメソッドも変わります。

JavaScript

const base = "https://yumesaku.tech/course-api/"; // 新しく足す。番号はサーバーが決めるので、一覧を指す // POST base + "comments.json" // 3 番を置き換える。相手が決まっているので、その 1 件を指す // PUT base + "comments/3.json"

新規作成のときは、まだ番号が決まっていません。番号を決めるのはサーバーの仕事です。だから送り先は一覧を指す URL になり、この一覧に 1 件足してください、という意味になります。存在しない番号の URL へ送ると 404 が返ります。

どちらなのかは、送るデータが番号を持っているかどうかで決めます。ここで気を付けたいのが if の書きかたです。

JavaScript

// 番号が 0 のときに新規扱いになってしまう if (comment.id) { } // 型で見れば 0 も番号として扱える if (typeof comment.id === "number") { }

返ってきた返事の読みかたは、取るときとまったく同じです。response.ok で分け、中身は response.json() で取り出します。新規作成が成功したときは 201 が返ることがよくありますが、ok は 200 から 299 で true になるので、そのまま成功として扱えます。

よくある間違い

  • headers を付け忘れる — 中身は JSON なのに、そう名乗っていない状態です。相手が読み方を決められず、送った中身がまるごと無視されることがあります
  • 新規作成なのに、番号付きの URL へ送る — まだ存在しない番号を指しているので 404 が返ります。新しく足すときの送り先は、いつでも一覧のほうです

要件

  1. buildWorkRequest(work) は { url, method, headers, body } を返す
  2. work.id が数値なら method は PUT で、url は https://yumesaku.tech/course-api/works/.json にする
  3. work.id が無ければ method は POST で、url は https://yumesaku.tech/course-api/works.json にする
  4. headers は { "Content-Type": "application/json" }、body は work を JSON.stringify したものにする
  5. work が null のとき、または title が文字列でないか空のときは null を返す

入出力例

buildWorkRequest({"title":"学習ログ","year":2026}) → {"body":"{\"title\":\"学習ログ\",\"year\":2026}","headers":{"Content-Type":"application/json"},"method":"POST","url":"https://yumesaku.tech/course-api/works.json"} buildWorkRequest({"id":3,"title":"スキル一覧の表","year":2026}) → {"body":"{\"id\":3,\"title\":\"スキル一覧の表\",\"year\":2026}","headers":{"Content-Type":"application/json"},"method":"PUT","url":"https://yumesaku.tech/course-api/works/3.json"} buildWorkRequest({"tags":["JavaScript","fetch"],"title":"作品ギャラリー"}) → {"body":"{\"tags\":[\"JavaScript\",\"fetch\"],\"title\":\"作品ギャラリー\"}","headers":{"Content-Type":"application/json"},"method":"POST","url":"https://yumesaku.tech/course-api/works.json"} buildWorkRequest({"title":""}) → null buildWorkRequest(null) → null

ヒント

先に「組み立てられない場合」を片づけます。work が無いときと title が空のときに return null しておくと、その下は正しい入力だけを考えて書けます。

id の有無で url と method の 2 つが同時に変わります。const isUpdate = typeof work.id === "number" のように一度変数に取ると、三項演算子 2 本で書けます。

body は必ず JSON.stringify(work) です。オブジェクトのまま入れると [object Object] という文字列になり、中身が消えます。

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • つくる 作品データを API から読む

    手で書いていた作品の配列を消し、API から取ってきたデータで作品ギャラリーを組み立てます。絞り込みと並び替えと失敗の表示までつなぎます。

  • 第2章まとめクイズ

    fetch の書きかた、response.ok の意味、リクエストの組み立てを、コードを読んで確かめます。

  • ファイルを分けるという考えかた

    長くなった app.js を役割ごとのファイルに切り分ける仕組みを読みます。export と import の形と、この教材では走らせられない理由を扱います。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 引数位置引数=順番で渡す。
  • オブジェクトキーと値のペアで構造を作るデータ
  • applicationJSON 本文を送るときの Content-Type
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • セット重複を持たない順序なし集合
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • URLページの住所全体
  • メソッドクラスに属する関数
main.js
学習モード
エディタを読み込んでいます

メモ

POST のリクエストを組み立てる

⌘S で保存