DevToolsでHTTP通信・エラー・DOMを確認する方法|新人エンジニア向けにブラウザ開発者ツールを解説
こんにちは。ゆうせいです。
今回は、ブラウザのDevToolsを使って、HTTP通信、JavaScriptエラー、DOMを確認する方法を新人エンジニア向けに解説します。
Spring Boot、Thymeleaf、JavaScript、fetch()、API連携を学んでいると、画面が思ったように動かない場面が必ず出てきます。
fetch()でAPIを呼んでいるはずなのに値が返ってこない
Spring Boot側で@RequestBodyの値がnullになる
Thymeleafで表示したはずのHTMLが見えない
CSSが効かない
404や500が出ているが原因がわからない
ボタンを押しても反応しない
このようなときに使うのが、DevToolsです。
DevToolsは、ブラウザに標準で入っている開発者向けの調査道具です。
Chrome DevToolsの公式ドキュメントでも、Networkパネルではページのネットワーク活動を調査でき、ElementsパネルではDOMツリーを確認・操作できると説明されています。
たとえるなら、DevToolsはWebアプリの「レントゲン写真」です。
画面だけ見てもわからない内部の通信、エラー、HTML構造、CSSの状態を確認できます。
DevToolsで確認できること
DevToolsでは、主に次のような情報を確認できます。
| 見たいもの | 使うタブ | 確認できる内容 |
|---|---|---|
| HTTP通信 | Network | URL、HTTPメソッド、ステータスコード、送信データ、レスポンス |
| JavaScriptエラー | Console | エラーメッセージ、console.log、警告 |
| HTML構造 | Elements | DOM、HTMLタグ、CSS、styleの適用状況 |
| JavaScriptの詳細デバッグ | Sources | ブレークポイント、変数、実行順序 |
| 保存データ | Application | Cookie、LocalStorage、SessionStorage |
新人エンジニアは、まずNetwork、Console、Elementsの3つを使えるようになれば十分です。
この3つを見れば、Webアプリの多くの不具合を切り分けられます。
DevToolsの開き方
ChromeやEdgeでは、次の方法でDevToolsを開けます。
| 操作 | 説明 |
|---|---|
| F12 | DevToolsを開く |
| Ctrl + Shift + I | DevToolsを開く |
| 右クリック → 検証 | クリックした要素をElementsで確認する |
Macの場合は、Command + Option + Iで開けます。
画面の下や右側に、開発者用のパネルが表示されます。
最初は情報量が多くて驚くかもしれません。
でも大丈夫です。
まず見る場所は、Network、Console、Elementsの3つだけです!
NetworkタブでHTTP通信を確認する
Networkタブは、ブラウザとサーバーの通信を見る場所です。
Spring Bootへリクエストが飛んでいるか、APIが何を返しているか、404や500が出ていないかを確認できます。
Chrome DevTools公式ドキュメントでは、Networkパネルを使うとネットワーク活動を記録し、各リクエストの詳細を確認できると説明されています。([(https://developer.chrome.com/docs/devtools/network?utm_source=chatgpt.com))
fetch()やフォーム送信で困ったら、まずNetworkを見てください。
Networkタブの基本的な使い方
1. DevToolsを開く 2. Networkタブをクリックする 3. 画面を再読み込みする 4. ボタンを押す、フォーム送信する、fetch()を実行する 5. 一覧に出てきた通信をクリックする 6. Headers、Payload、Responseを確認する
Networkタブを開いたあとに操作するのがポイントです。
先に操作してからNetworkを開くと、通信が記録されていないことがあります。
Networkで見るべき項目
| 項目 | 意味 | 確認ポイント |
|---|---|---|
| Name | リクエスト名 | どのURLへアクセスしたか |
| Status | HTTPステータス | 200、201、400、404、500など |
| Method | HTTPメソッド | GET、POST、PUT、DELETEなど |
| Type | 種類 | document、fetch、script、cssなど |
| Payload | 送信データ | フォーム値やJSONが正しく送られているか |
| Response | 返却内容 | HTML、JSON、エラーメッセージ |
Networkタブは、郵便追跡のようなものです。
どこへ送ったのか、何を送ったのか、相手から何が返ってきたのかを確認できます。
HTTPステータスコードを見る
Networkで最初に見るべきなのは、Statusです。
| ステータス | 意味 | 新人向けの見方 |
|---|---|---|
| 200 OK | 成功 | 正常に取得できた |
| 201 Created | 作成成功 | 登録APIなどが成功した |
| 302 Found | リダイレクト | 別URLへ移動している |
| 400 Bad Request | リクエスト不正 | 送った値や形式に問題がある |
| 401 Unauthorized | 未認証 | ログインしていない |
| 403 Forbidden | 禁止 | 権限がない |
| 404 Not Found | 見つからない | URLやControllerのMappingが違う |
| 405 Method Not Allowed | メソッド不一致 | GETなのにPOST用URLへ送っているなど |
| 415 Unsupported Media Type | メディアタイプ不一致 | JSONなのにContent-Typeが違うなど |
| 500 Internal Server Error | サーバー内部エラー | Spring Boot側で例外が起きている |
ステータスコードは、サーバーからの返事です。
テストの採点でたとえるなら、200は「正解」、400は「問題文の読み間違い」、404は「提出先の教室を間違えた」、500は「採点する先生側でトラブル」です。
fetch()の通信をNetworkで確認する
たとえば、JavaScriptで次のfetch()を書いたとします。
const requestData = {
name: "山田太郎",
email: "yamada@example.com"
};
fetch("/api/users", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestData)
})
.then(function (response) {
return response.json();
})
.then(function (data) {
console.log(data);
});
Networkタブでは、/api/usersという通信を探します。
クリックしたら、次の項目を確認します。
| Network内の場所 | 確認内容 |
|---|---|
| Headers | Request URL、Request Method、Status Code、Content-Type |
| Payload | 送信したJSON |
| Response | Spring Boot APIから返ってきたJSON |
| Preview | JSONを見やすく整形した表示 |
Spring Boot側で@RequestBodyの値がnullになる場合、Payloadを見てください。
PayloadにJSONが出ていなければ、JavaScript側で送れていません。
PayloadにJSONがあるのにSpring Boot側でnullなら、DTOのプロパティ名、setter、Content-Type、@RequestBodyを確認します。
フォーム送信をNetworkで確認する
HTMLフォームの場合もNetworkで確認できます。
<form th:action="@{/users}" method="post">
<input type="text" name="name">
<input type="email" name="email">
<button type="submit">登録</button>
</form>
送信後、Networkで/usersの通信をクリックします。
PayloadまたはForm Dataに、次のような値が出ます。
name: 山田太郎 email: yamada@example.com
ここに値が出ていない場合は、HTMLのname属性を確認してください。
フォーム送信では、inputのname属性がないと値が送られません。
悪い例です。
<input type="text" id="name">
良い例です。
<input type="text" id="name" name="name">
idは画面上の部品を識別する名前です。
nameはサーバーへ送るときの名前です。
Spring Bootの@RequestParamと対応するのはnameです。
PRGパターンのredirectもNetworkで確認できる
PRGパターンでは、POST後にredirectします。
@PostMapping("/users")
public String register() {
return "redirect:/users";
}
Networkを見ると、次のような流れが確認できます。
| 順番 | Method | URL | Status |
|---|---|---|---|
| 1 | POST | /users | 302 |
| 2 | GET | /users | 200 |
302は「別のURLへ移動してください」という意味です。
その後、GET /usersで一覧画面が表示されます。
PRGパターンが本当に動いているか確認したいときも、Networkタブが役立ちます。
ConsoleタブでJavaScriptエラーを確認する
Consoleタブは、JavaScriptのエラーやconsole.logの結果を見る場所です。
Chrome DevTools公式ドキュメントでは、Consoleを使ってconsole.logメッセージを確認できるだけでなく、任意のJavaScript文を評価してバグ修正の仮説を試せると説明されています。
画面のボタンを押しても反応しないときは、Consoleを見てください。
JavaScriptでエラーが出ている可能性があります。
Consoleでよく見るエラー
| エラー例 | 意味 | 確認ポイント |
|---|---|---|
| Uncaught ReferenceError | 変数や関数が見つからない | 名前のスペル、scriptの読み込み順 |
| Cannot read properties of null | nullに対して処理しようとした | idの指定、HTML読み込み前の実行 |
| Unexpected token | 文法エラー | カンマ、括弧、クォーテーション |
| Failed to fetch | fetch通信に失敗 | URL、CORS、サーバー起動状態 |
| 404 in console | ファイルやAPIが見つからない | パス、static配下、ControllerのURL |
Consoleのエラーは、JavaScriptからの悲鳴です。
画面が無言で動かないときでも、Consoleには「ここで困っています」と出ていることがよくあります。
console.logで値を確認する
JavaScriptの変数に何が入っているか確認したいときは、console.logを使います。
const name = document.getElementById("name").value;
console.log("入力された名前:", name);
fetch()で送る直前のデータも確認できます。
const requestData = {
name: name,
email: email
};
console.log("送信データ:", requestData);
APIから返ってきたデータも確認できます。
fetch("/api/users")
.then(function (response) {
return response.json();
})
.then(function (data) {
console.log("APIのレスポンス:", data);
});
console.logは、JavaScriptのSystem.out.printlnのようなものです。
ただし、実務では個人情報やパスワードをConsoleに出さないように注意してください。
ConsoleでJavaScriptを直接試す
Consoleでは、その場でJavaScriptを実行できます。
たとえば、画面に次のHTMLがあるとします。
<input type="text" id="name" value="山田太郎">
Consoleに次のように入力できます。
document.getElementById("name").value
結果として、次のように表示されます。
山田太郎
ボタンが見つかるか確認することもできます。
document.getElementById("registerButton")
nullが返ってきたら、idが違うか、HTMLがまだ存在していません。
このようにConsoleは、コードの一部をその場で試す実験室として使えます。
ElementsタブでDOMを確認する
Elementsタブは、ブラウザが実際に解釈しているHTML構造、つまりDOMを確認する場所です。
Chrome DevTools公式ドキュメントでは、ElementsパネルはDOMツリーを調べたり操作したりでき、HTMLに似たDOMツリーから特定のノードを選択できると説明されています。
DOMとは、Document Object Modelの略です。
ブラウザがHTMLを読み取って作った、画面の部品ツリーだと考えてください。
HTMLファイルは設計図です。
DOMは、設計図をもとにブラウザが実際に組み立てた建物です。
HTMLソースとDOMは違う
新人エンジニアが混乱しやすい点として、HTMLソースとDOMは同じではありません。
Thymeleafでは、サーバー側でHTMLが生成されます。
たとえば、テンプレートには次のように書いていたとします。
<p th:text="${user.name}"></p>
ブラウザに届いた後のDOMでは、次のようになっているかもしれません。
<p>山田太郎</p>
Elementsタブで見るのは、ブラウザに届いて解釈された後のDOMです。
Thymeleafのth:textそのものではなく、変換後のHTMLを見ることになります。
つまり、Elementsは「最終的にブラウザが見ている姿」を確認する場所です。
Elementsでよく確認すること
| 確認したいこと | 見る場所 | 例 |
|---|---|---|
| 要素が存在するか | DOMツリー | id="registerButton"があるか |
| idやnameが正しいか | 選択したHTML | name="email"になっているか |
| CSSが効いているか | Styles | display:noneになっていないか |
| 入力値が入っているか | input要素 | value属性や現在値 |
| Thymeleafの結果 | 変換後HTML | th:textが正しく表示されているか |
画面に表示されない原因は、サーバー側だけとは限りません。
HTMLは存在しているけれど、CSSで非表示になっている場合もあります。
ElementsでDOMとStylesを確認しましょう。
idとnameをElementsで確認する
fetch()やフォーム送信でよくあるミスは、idとnameの混同です。
<input type="text" id="userName" name="name">
JavaScriptで値を取るときは、idを使うことが多いです。
document.getElementById("userName").value
フォーム送信でSpring Bootへ送るときは、nameが重要です。
@RequestParam String name
| 属性 | 主な使い道 |
|---|---|
| id | JavaScriptやCSSで特定要素を探す |
| name | フォーム送信時のパラメータ名 |
Elementsでinputを選択し、idとnameが期待どおりか確認してください。
ここを見れば、Spring Boot側で値が取れない原因が見つかることがよくあります。
CSSが効かない原因をElementsで確認する
Elementsタブの右側にはStylesがあります。
Stylesでは、その要素にどのCSSが適用されているか確認できます。
たとえば、ボタンが見えない場合、次のようなCSSが効いているかもしれません。
display: none;
また、文字色と背景色が同じで見えない場合もあります。
color: white; background-color: white;
CSSは「効いていない」のではなく、「別のCSSに上書きされている」ことも多いです。
Stylesを見ると、どのCSSが有効で、どのCSSが打ち消されているかを確認できます。
DevTools上で一時的にHTMLやCSSを変更する
Elementsでは、HTMLやCSSを一時的に変更できます。
たとえば、Stylesでheightを変更して地図の高さを試すことができます。
#map {
height: 500px;
}
画面上ではすぐ反映されます。
ただし、DevTools上の変更はファイルには保存されません。
ページを再読み込みすると元に戻ります。
DevToolsで試して、良さそうなら実際のCSSファイルやHTMLへ反映します。
DevToolsは、下書き用のホワイトボードのようなものです。
本番のノートに清書するには、ソースコード側を修正してください。
Spring Boot開発でよくある確認パターン
パターン1:APIが呼ばれているか確認したい
1. Networkタブを開く 2. ボタンを押す 3. /api/usersなどの通信があるか探す 4. Statusを見る 5. PayloadとResponseを見る
通信がなければ、JavaScriptのイベントが動いていない可能性があります。
Consoleでエラーを確認しましょう。
パターン2:Spring Boot側で@RequestBodyがnullになる
1. Networkタブで対象APIをクリックする 2. Headersを見る 3. Content-Typeがapplication/jsonか確認する 4. Payloadを見る 5. JSONのキー名を確認する 6. Java DTOのプロパティ名とsetterを確認する
fetch()側では、次の3点が重要です。
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestData)
Spring Boot側では、@RequestBodyが必要です。
@PostMapping("/api/users")
public UserDto createUser(@RequestBody UserCreateRequest request) {
return userService.create(request);
}
パターン3:フォーム送信で@RequestParamが取れない
1. Elementsでinputのname属性を見る 2. NetworkでForm Dataを見る 3. Controllerの@RequestParam名と比較する
HTMLです。
<input type="text" name="email">
Controllerです。
@RequestParam String email
この名前が一致しているか確認してください。
パターン4:ボタンを押しても反応しない
1. ConsoleにJavaScriptエラーがないか見る 2. Elementsでボタンのidを確認する 3. JavaScriptのgetElementByIdの名前と比較する 4. scriptファイルが読み込まれているかNetworkで確認する
よくあるミスです。
<button id="registerButton">登録</button>
document.getElementById("registButton")
HTMLではregisterButton。
JavaScriptではregistButton。
スペルが違うため、JavaScript側で要素を取得できません。
パターン5:Thymeleafで値が表示されない
1. Controllerでmodel.addAttributeの名前を確認する
2. Thymeleafの${...}の名前を確認する
3. Elementsで実際に出力されたHTMLを見る
4. ConsoleやNetworkで500エラーが出ていないか確認する
Controllerです。
model.addAttribute("user", userDto);
Thymeleafです。
<p th:text="${user.name}"></p>
Model名とThymeleafの変数名が一致しているか確認してください。
ApplicationタブでCookieやSession関連を確認する
ログイン機能を作っていると、CookieやSessionも気になることがあります。
DevToolsのApplicationタブでは、CookieやLocalStorageなどを確認できます。
| 項目 | 確認できるもの |
|---|---|
| Cookies | JSESSIONIDなどのCookie |
| Local Storage | ブラウザに保存したデータ |
| Session Storage | タブを閉じるまでの保存データ |
Spring Bootのセッションを使っている場合、JSESSIONIDというCookieが出ることがあります。
JSESSIONIDは、ブラウザとサーバー側セッションを結びつけるためのIDです。
ログイン状態がうまく維持されない場合、Cookieが保存されているか確認するとヒントになります。
Sourcesタブでブレークポイントを使う
JavaScriptの動きを細かく追いたい場合は、Sourcesタブを使います。
Sourcesでは、JavaScriptの行にブレークポイントを置けます。
ブレークポイントとは、「この行で一時停止してください」という印です。
document.getElementById("registerButton").addEventListener("click", function () {
const name = document.getElementById("name").value;
const email = document.getElementById("email").value;
});
nameを取得する行にブレークポイントを置くと、ボタンを押したタイミングで処理が止まります。
その時点の変数の値を確認できます。
JavaのEclipseデバッガと似ています。
JavaScriptにもデバッガがある、と覚えてください。
DevToolsで調査するときの基本順序
不具合調査では、見る順番を決めると迷いにくくなります。
1. Consoleを見る 2. Networkを見る 3. Elementsを見る 4. Spring BootのConsoleログを見る 5. JavaのデバッガでControllerやServiceを確認する
まずConsoleでJavaScriptエラーを確認します。
次にNetworkでHTTP通信を確認します。
画面やHTMLの問題ならElementsを確認します。
サーバー側までリクエストが届いているなら、Spring BootのログやJavaデバッガを見ます。
フロント側かサーバー側かを切り分けるのが重要です。
フロント側とサーバー側の切り分け
| 症状 | 見る場所 | 判断 |
|---|---|---|
| Networkに通信が出ない | Console、Elements | JavaScriptやHTML側の問題が多い |
| Networkに通信が出て404 | Network、Controller | URLやMappingの問題が多い |
| Networkに通信が出て400 | Payload、DTO、バリデーション | 送信データや形式の問題が多い |
| Networkに通信が出て500 | Spring Bootログ、Javaデバッガ | サーバー側例外が多い |
| 通信は200だが画面が変わらない | Console、JavaScript処理 | レスポンス後の表示処理の問題が多い |
この切り分けができると、調査がかなり速くなります。
「なんとなく動かない」から、「HTTPは200で返っているが、JavaScriptの画面反映処理が動いていない」まで具体化できます。
新人エンジニアが最初に覚えるチェックリスト
| 確認項目 | 見る場所 |
|---|---|
| JavaScriptエラーがあるか | Console |
| APIに通信が飛んでいるか | Network |
| HTTPステータスは何か | NetworkのStatus |
| 送信データは正しいか | NetworkのPayload |
| APIレスポンスは何か | NetworkのResponse |
| HTML要素のidやnameは正しいか | Elements |
| CSSで非表示になっていないか | ElementsのStyles |
| CookieやSession IDはあるか | Application |
このチェックリストを見ながら調査するだけでも、原因を見つけやすくなります。
よくある失敗とDevToolsでの見つけ方
| 失敗 | DevToolsでの見つけ方 | 修正例 |
|---|---|---|
| APIのURLが違う | Networkで404を見る | fetchのURLと@GetMappingを合わせる |
| POSTのつもりがGETになっている | NetworkのMethodを見る | method: "POST"を指定する |
| JSONを送れていない | Payloadが空 | JSON.stringifyを使う |
| Content-Typeが違う | Headersを見る | application/jsonを指定する |
| JavaScriptのid指定が違う | Consoleでnullエラーを見る | Elementsで実際のidを確認する |
| CSSで隠れている | ElementsのStylesを見る | displayやvisibilityを確認する |
| Thymeleafの値が出ない | Elementsで最終HTMLを見る | Model名とプロパティ名を確認する |
DevToolsを使うときの注意点
DevToolsは便利ですが、いくつか注意点があります。
| 注意点 | 理由 |
|---|---|
| DevTools上のHTML変更は保存されない | 再読み込みすると元に戻る |
| パスワードをConsoleに出さない | ログから漏れる危険がある |
| APIレスポンスに機密情報を出さない | Networkで誰でも見える |
| 本番環境の調査は慎重に行う | 個人情報や機密データが表示される可能性がある |
Networkタブでは、APIから返ってきたJSONが見えます。
つまり、passwordHashや個人情報をAPIレスポンスに入れていると、ブラウザ側で見えてしまいます。
「画面に表示していないから安全」ではありません。
レスポンスに含めた時点で、DevToolsから確認できます。
APIでは、外に出してよい情報だけを返してください。
まとめ
DevToolsは、Webアプリケーション開発で必須の調査道具です。
Spring Boot、Thymeleaf、fetch()、API連携、JavaScript、CSSの不具合を調べるときに役立ちます。
| タブ | 主な役割 |
|---|---|
| Network | HTTP通信、ステータス、Payload、Responseを確認する |
| Console | JavaScriptエラーやconsole.logを確認する |
| Elements | DOM、HTML、CSSを確認する |
| Application | Cookie、LocalStorage、SessionStorageを確認する |
| Sources | JavaScriptをブレークポイントでデバッグする |
一言でまとめるなら、DevToolsは「ブラウザ側で何が起きているかを見るための診断装置」です。
新人エンジニアは、まず次の流れを覚えてください。
画面が動かない
↓
ConsoleでJavaScriptエラーを見る
↓
NetworkでHTTP通信を見る
↓
PayloadとResponseを見る
↓
ElementsでDOMとid、name、CSSを見る
↓
必要ならSpring BootログやJavaデバッガを見る
今後の学習では、NetworkのHeaders、Payload、Response、Consoleのエラー読み取り、ElementsのDOM確認、ApplicationのCookie確認、Sourcesのブレークポイントを順番に学ぶとよいです。まずはfetch()でAPIを呼ぶ小さな画面を作り、DevToolsのNetworkで送信JSONとレスポンスJSONを確認してみましょう!
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
新人エンジニア研修講師2026年6月18日JavaのOptionalでnullを安全に扱う方法|NullPointerExceptionを防ぎ、DAOの戻り値をわかりやすくする
新人エンジニア研修講師2026年6月18日ローカルSMTPを使って問い合わせ完了メールを送る方法|新人エンジニア研修向けにSpring BootとJavaMailSenderを解説
新人エンジニア研修講師2026年6月18日DevToolsでHTTP通信・エラー・DOMを確認する方法|新人エンジニア向けにブラウザ開発者ツールを解説
新人エンジニア研修講師2026年6月18日Spring Bootの@RestControllerとは?Webアプリケーションを学んだ新人エンジニア向けにAPIをやさしく解説
