fetch()とSpring Boot APIを連携する方法|新人エンジニア向けにJavaScriptと@RestControllerを解説

こんにちは。ゆうせいです。

今回は、JavaScriptのfetch()とSpring Boot APIを連携する方法を、新人エンジニア向けに解説します。

Webアプリケーションを学んできた人は、これまでHTMLフォームを使ってSpring Bootへ値を送っていたと思います。

<form action="/users/register" method="post">
    <input name="name">
    <button type="submit">送信</button>
</form>




この方法では、送信ボタンを押すと画面全体が遷移します。

一方、fetch()を使うと、画面全体を再読み込みせずに、JavaScriptからSpring Boot APIへHTTPリクエストを送れます。

たとえるなら、HTMLフォームは「窓口へ紙の申請書を持っていく方法」です。

fetch()は「スマホで窓口にデータだけ送る方法」です。

画面はそのままにして、裏側でデータの取得や登録ができます。

MDNでは、fetch()はHTTPリクエストを行いレスポンスを処理するためのJavaScriptインターフェイスであり、Promiseベースで動作すると説明されています。fetch()が返すPromiseは、サーバーのレスポンスを表すResponseオブジェクトで解決され、response.json()などで本文を取り出せます。

fetch()とSpring Boot APIの関係

まず、全体像を見てください。

HTML画面
        ↓
JavaScriptのfetch()
        ↓
Spring Bootの@RestController
        ↓
Service
        ↓
DAOまたはRepository
        ↓
DB

fetch()は、ブラウザ側のJavaScriptからHTTP通信を行うための機能です。

Spring Boot APIは、@RestControllerで作る「JSONなどのデータを返す入口」です。

部品役割
HTML入力欄やボタンを表示する
JavaScriptボタン押下時にfetch()で通信する
fetch()Spring Boot APIへHTTPリクエストを送る
@RestControllerリクエストを受け取り、JSONを返す
@RequestBody送られてきたJSONをJavaオブジェクトに変換する
ResponseEntityHTTPステータスとレスポンス本文を返す

つまり、fetch()と@RestControllerを組み合わせると、画面をリロードせずにSpring Bootとデータをやり取りできます。

今回作るサンプル

今回は、ユーザー名とメールアドレスを画面から入力し、fetch()でSpring Boot APIへ送信します。

Spring Boot側はJSONを受け取り、登録できた想定でJSONを返します。

画面で名前とメールアドレスを入力
        ↓
登録ボタンを押す
        ↓
fetch()でJSONをPOST送信
        ↓
Spring Boot APIが@RequestBodyで受け取る
        ↓
登録結果のJSONを返す
        ↓
JavaScriptが結果を画面に表示する

この流れを理解できると、JavaScriptとSpring Bootを分けた開発の第一歩がつかめます。

Spring Boot側のDTOを作る

まず、APIで受け取るリクエスト用DTOを作ります。

DTOとは、Data Transfer Objectの略です。

データを運ぶための箱だと考えてください。

package com.example.demo.dto;

public class UserCreateRequest {

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

     public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}




このクラスは、JavaScriptから送られてくるJSONを受け取るための箱です。

たとえば、JavaScriptから次のJSONを送ります。

{
    "name": "山田太郎",
    "email": "yamada@example.com"
}




Spring Bootは、このJSONをUserCreateRequestに変換します。

JSONJava
"name"private String name
"email"private String email

JSONのキー名とJavaのプロパティ名を合わせるのが基本です。

レスポンス用DTOを作る

次に、APIから返すレスポンス用DTOを作ります。

package com.example.demo.dto;

public class UserCreateResponse {

    private int userId;
    private String name;
    private String email;
    private String message;

    public UserCreateResponse(int userId, String name, String email, String message) {
        this.userId = userId;
        this.name = name;
        this.email = email;
        this.message = message;
    }

    public int getUserId() {
        return userId;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public String getMessage() {
        return message;
    }
}




Spring Boot APIは、このJavaオブジェクトをJSONに変換して返します。

返却されるJSONのイメージです。

{
    "userId": 1,
    "name": "山田太郎",
    "email": "yamada@example.com",
    "message": "ユーザー登録が完了しました。"
}




@RestControllerでは、Javaオブジェクトを返すと、Spring側の仕組みによってJSONなどのレスポンス本文に変換されます。@RestControllerは@Controllerと@ResponseBodyを合わせた便利なアノテーションであり、戻り値がレスポンス本文として扱われます。

Spring Bootの@RestControllerを作る

次に、fetch()から呼び出されるAPIを作ります。

package com.example.demo.controller;

import com.example.demo.dto.UserCreateRequest;
import com.example.demo.dto.UserCreateResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserApiController {

    @PostMapping("/api/users")
    public ResponseEntity<UserCreateResponse> createUser(
            @RequestBody UserCreateRequest request) {

        UserCreateResponse response = new UserCreateResponse(
                1,
                request.getName(),
                request.getEmail(),
                "ユーザー登録が完了しました。"
        );

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(response);
    }
}




このAPIは、POST /api/usersを受け取ります。

@RequestBodyは、リクエスト本文のJSONをJavaオブジェクトへ変換するために使います。Spring Frameworkの公式ドキュメントでも、@RequestBodyはリクエスト本文を読み取り、HttpMessageConverterを通じてオブジェクトへ変換するために使うと説明されています。

コード意味
@RestControllerJSONなどのデータを返すControllerにする
@PostMapping("/api/users")POST /api/usersを受け取る
@RequestBody UserCreateRequest request送られてきたJSONをJavaオブジェクトにする
ResponseEntityHTTPステータスとJSON本文を返す
HttpStatus.CREATED201 Createdを返す

201 Createdは、「新しいデータを作成しました」という意味のHTTPステータスです。

登録APIでは、200 OKより201 Createdを使うとAPIらしい表現になります。

HTML画面を作る

次に、入力画面を作ります。

今回はThymeleafを使わず、まずは普通のHTMLとして書きます。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>fetchとSpring Boot API連携サンプル</title>
</head>
<body>

<h1>ユーザー登録</h1>

<div>
    <label for="name">名前</label>
    <input type="text" id="name">
</div>

<div>
    <label for="email">メールアドレス</label>
    <input type="email" id="email">
</div>

<button type="button" id="registerButton">登録</button>

<p id="resultArea"></p>

<script src="/js/user-register.js"></script>

</body>
</html>

ポイントは、buttonのtypeをbuttonにしていることです。

<button type="button" id="registerButton">登録</button>

type="submit"にすると、フォーム送信で画面遷移が起きることがあります。

今回はfetch()で通信したいので、type="button"にしています。

また、結果表示用にresultAreaを用意しています。

<p id="resultArea"></p>

APIから返ってきたメッセージを、この場所に表示します。

JavaScriptでfetch()を書く

次に、JavaScriptを書きます。

ファイルの場所は、Spring Bootなら次のようにします。

src/main/resources/static/js/user-register.js

user-register.jsです。

document.getElementById("registerButton").addEventListener("click", function () {

    const name = document.getElementById("name").value;
    const email = document.getElementById("email").value;

    const requestData = {
        name: name,
        email: email
    };

    fetch("/api/users", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(requestData)
    })
        .then(function (response) {
            if (!response.ok) {
                throw new Error("API通信でエラーが発生しました。");
            }
            return response.json();
        })
        .then(function (data) {
            document.getElementById("resultArea").textContent =
                data.message + " ID: " + data.userId;
        })
        .catch(function (error) {
            document.getElementById("resultArea").textContent =
                "登録に失敗しました。";
            console.error(error);
        });
});

このJavaScriptが、HTML画面とSpring Boot APIをつなぐ役割を持ちます。

fetch()の中身を分解する

fetch()の基本形は次のようになります。

fetch("URL", {
    method: "HTTPメソッド",
    headers: {
        "Content-Type": "送るデータの種類"
    },
    body: "送るデータ"
})

今回のコードでは、次の意味になります。

fetchの設定意味
"/api/users"Spring Boot APIのURL
method: "POST"POSTで送信する
Content-Type: "application/json"JSONを送ることを伝える
body: JSON.stringify(requestData)JavaScriptオブジェクトをJSON文字列に変換して送る

JavaScriptのオブジェクトをそのままbodyに入れることはできません。

JSON.stringify()でJSON文字列に変換します。

body: JSON.stringify(requestData)

お弁当でたとえるなら、JavaScriptオブジェクトは料理そのものです。

JSON.stringify()は、その料理を配送用の箱に詰める作業です。

箱に詰めて初めて、HTTP通信で送れる形になります。

response.json()とは何か

APIから返ってきたレスポンスは、そのままではJavaScriptオブジェクトとして使えません。

JSONとして取り出すために、response.json()を使います。

return response.json();

MDNでは、fetch()で得たResponseに対して適切なメソッドを呼び出すことで、レスポンス本文をtextやJSONなどの形式で取り出せると説明されています。

Spring Boot APIが次のJSONを返したとします。

{
    "userId": 1,
    "name": "山田太郎",
    "email": "yamada@example.com",
    "message": "ユーザー登録が完了しました。"
}




response.json()を使うと、JavaScript側では次のように扱えます。

data.userId
data.name
data.email
data.message

JSON文字列をJavaScriptで使える形に変換するのがresponse.json()です。

GETでデータを取得するAPI

POSTだけでなく、GETでデータを取得する例も見てみましょう。

Spring Boot側です。

package com.example.demo.controller;

import com.example.demo.dto.UserCreateResponse;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserApiController {

    @GetMapping("/api/users")
    public List<UserCreateResponse> findAllUsers() {

        List<UserCreateResponse> users = new ArrayList<>();

        users.add(new UserCreateResponse(1, "山田太郎", "yamada@example.com", "取得成功"));
        users.add(new UserCreateResponse(2, "鈴木花子", "suzuki@example.com", "取得成功"));

        return users;
    }
}




JavaScript側です。

fetch("/api/users")
    .then(function (response) {
        if (!response.ok) {
            throw new Error("ユーザー一覧の取得に失敗しました。");
        }
        return response.json();
    })
    .then(function (userList) {
        console.log(userList);

        const resultArea = document.getElementById("resultArea");
        resultArea.textContent = "";

        userList.forEach(function (user) {
            const p = document.createElement("p");
            p.textContent = user.userId + ": " + user.name + " " + user.email;
            resultArea.appendChild(p);
        });
    })
    .catch(function (error) {
        console.error(error);
    });




GETの場合、methodを省略するとGETになります。

データ取得ではGET。

新規登録ではPOST。

まずはこの対応を覚えてください。

目的HTTPメソッドfetchの書き方
一覧取得GETfetch("/api/users")
詳細取得GETfetch("/api/users/1")
新規登録POSTfetch("/api/users", { method: "POST", ... })
更新PUTfetch("/api/users/1", { method: "PUT", ... })
削除DELETEfetch("/api/users/1", { method: "DELETE" })

asyncとawaitで書く方法

fetch()はthenで書けますが、asyncとawaitを使うと、上から順に処理しているように書けます。

document.getElementById("registerButton").addEventListener("click", async function () {

    const name = document.getElementById("name").value;
    const email = document.getElementById("email").value;

    const requestData = {
        name: name,
        email: email
    };

    try {
        const response = await fetch("/api/users", {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(requestData)
        });

        if (!response.ok) {
            throw new Error("API通信でエラーが発生しました。");
        }

        const data = await response.json();

        document.getElementById("resultArea").textContent =
            data.message + " ID: " + data.userId;

    } catch (error) {
        document.getElementById("resultArea").textContent =
            "登録に失敗しました。";
        console.error(error);
    }
});




asyncは、「この関数の中でawaitを使います」という印です。

awaitは、「処理が終わるまで待ちます」という意味です。

電話でたとえるなら、fetch()は相手に電話をかける処理です。

awaitは、相手が返事をするまで待つことです。

Spring Boot側でバリデーションする

APIでも、サーバー側バリデーションは必要です。

画面側のJavaScriptで入力チェックしていても、直接APIを叩けば回避できるからです。

まず、DTOにバリデーションを追加します。

package com.example.demo.dto;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;

public class UserCreateRequest {

    @NotBlank(message = "名前を入力してください。")
    private String name;

    @NotBlank(message = "メールアドレスを入力してください。")
    @Email(message = "メールアドレスの形式で入力してください。")
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

     public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}




Controllerでは、@Validを付けます。

package com.example.demo.controller;

import com.example.demo.dto.UserCreateRequest;
import com.example.demo.dto.UserCreateResponse;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserApiController {

    @PostMapping("/api/users")
    public ResponseEntity<UserCreateResponse> createUser(
            @Valid @RequestBody UserCreateRequest request) {

        UserCreateResponse response = new UserCreateResponse(
                1,
                request.getName(),
                request.getEmail(),
                "ユーザー登録が完了しました。"
        );

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(response);
    }
}




@RequestBodyは@Validと組み合わせて使えます。Spring Frameworkのドキュメントでも、@RequestBodyはjakarta.validation.ValidやSpringの@Validatedと組み合わせられ、検証エラーはデフォルトでMethodArgumentNotValidExceptionになり、400 Bad Requestレスポンスにつながると説明されています。

APIでは、入力エラー時にJSONでエラーを返すようにすると、JavaScript側で扱いやすくなります。

@RestControllerAdviceでAPIエラーをJSON化する

バリデーションエラーをJSONで返すため、@RestControllerAdviceを作ります。

package com.example.demo.exception;

import java.util.ArrayList;
import java.util.List;

public class ApiErrorResponse {

    private int status;
    private String message;
    private List<String> errors;

    public ApiErrorResponse(int status, String message, List<String> errors) {
        this.status = status;
        this.message = message;
        this.errors = errors;
    }

    public int getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }

    public List<String> getErrors() {
        return errors;
    }
}

package com.example.demo.exception;

import java.util.ArrayList;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ApiErrorResponse> handleValidationException(
            MethodArgumentNotValidException e) {

        List<String> errors = new ArrayList<>();

        e.getBindingResult().getFieldErrors().forEach(functionError -> {
            errors.add(functionError.getDefaultMessage());
        });

        ApiErrorResponse response = new ApiErrorResponse(
                400,
                "入力内容にエラーがあります。",
                errors
        );

        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body(response);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ApiErrorResponse> handleException(Exception e) {

        List<String> errors = new ArrayList<>();
        errors.add("サーバー内部でエラーが発生しました。");

        ApiErrorResponse response = new ApiErrorResponse(
                500,
                "予期しないエラーが発生しました。",
                errors
        );

        return ResponseEntity
                .status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(response);
    }
}

このようにしておくと、入力エラー時に次のようなJSONを返せます。

{
    "status": 400,
    "message": "入力内容にエラーがあります。",
    "errors": [
        "名前を入力してください。",
        "メールアドレスの形式で入力してください。"
    ]
}


APIのエラー形式をそろえると、JavaScript側でエラー表示を作りやすくなります。

JavaScript側でエラーJSONを表示する

400エラー時に、Spring Bootから返ったJSONを画面に表示してみましょう。

document.getElementById("registerButton").addEventListener("click", async function () {

    const name = document.getElementById("name").value;
    const email = document.getElementById("email").value;

    const requestData = {
        name: name,
        email: email
    };

    try {
        const response = await fetch("/api/users", {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(requestData)
        });

        const data = await response.json();

        if (!response.ok) {
            document.getElementById("resultArea").textContent =
                data.errors.join(" ");
            return;
        }

        document.getElementById("resultArea").textContent =
            data.message + " ID: " + data.userId;

    } catch (error) {
        document.getElementById("resultArea").textContent =
            "通信に失敗しました。";
        console.error(error);
    }
});




このコードでは、response.okがfalseの場合、エラーメッセージを表示します。

if (!response.ok) {
    document.getElementById("resultArea").textContent =
        data.errors.join(" ");
    return;
}




response.okは、HTTPステータスが成功範囲かどうかを見るために便利です。

fetch()では、404や500でも通信自体が完了していればthenやawaitの続きに進む点に注意してください。

つまり、HTTPエラーは自分でresponse.okを見て判断する必要があります。

CORSエラーとは何か

fetch()とSpring Boot APIを連携するとき、よく出るのがCORSエラーです。

CORSとは、Cross-Origin Resource Sharingの略です。

ブラウザの安全機能の1つです。

たとえば、HTML画面が次のURLで動いているとします。

http://localhost:3000

Spring Boot APIが次のURLで動いているとします。

http://localhost:8080

ポート番号が違うため、ブラウザから見ると別オリジンです。

この状態でfetch()すると、CORSエラーが出ることがあります。

Spring FrameworkのCORSドキュメントでは、セキュリティ上の理由から、ブラウザは現在のオリジン外へのAJAX呼び出しを禁止しており、CORSによって許可するクロスドメインリクエストを指定できると説明されています。

URL意味
http://localhost:3000フロントエンド開発サーバー
http://localhost:8080Spring Boot API
ポートが違う別オリジン扱いになる

同じ家に見えても、玄関が違う建物として扱われるイメージです。

@CrossOriginでCORSを許可する

開発中の簡単な対応として、Controllerに@CrossOriginを付ける方法があります。

package com.example.demo.controller;

import com.example.demo.dto.UserCreateRequest;
import com.example.demo.dto.UserCreateResponse;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@CrossOrigin(origins = "http://localhost:3000")
@RestController
public class UserApiController {

    @PostMapping("/api/users")
    public ResponseEntity<UserCreateResponse> createUser(
            @Valid @RequestBody UserCreateRequest request) {

        UserCreateResponse response = new UserCreateResponse(
                1,
                request.getName(),
                request.getEmail(),
                "ユーザー登録が完了しました。"
        );

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(response);
    }
}




originsには、許可したいフロントエンドのURLを書きます。

@CrossOrigin(origins = "http://localhost:3000")

ただし、実務で何でも許可する設定は危険です。

@CrossOrigin(origins = "*")

学習用なら見かけることがありますが、本番では許可するオリジンを必要最小限にしましょう。

fetch()とSpring Boot APIでよくあるミス

ミス原因対策
Spring Boot側で値がnullになるJSONキー名とDTOプロパティ名が違うname、emailなどの名前を合わせる
415 Unsupported Media TypeになるContent-Typeを付けていないapplication/jsonを指定する
400 Bad RequestになるJSON形式が壊れている、型が違うJSON.stringifyを使う
404 Not FoundになるURLが違うfetchのURLと@PostMappingを確認する
CORSエラーになるフロントエンドとAPIのオリジンが違う@CrossOriginやCORS設定を行う
画面に[object Object]と出るオブジェクトをそのままtextContentに入れているdata.messageなど具体的なプロパティを使う

fetch()連携のエラーは、ブラウザのConsoleとNetworkを見ると原因がわかりやすいです。

ConsoleはJavaScriptエラーを見る場所です。

NetworkはHTTPリクエストとレスポンスを見る場所です。

新人エンジニアは、fetch()で困ったら必ず開発者ツールを開いてください!

Networkタブで見るべきポイント

見る場所確認内容
Request URL正しいAPI URLへ送っているか
Request MethodGET、POST、PUT、DELETEが合っているか
Status Code200、201、400、404、500など
Request HeadersContent-Typeがapplication/jsonか
Request Payload送ったJSONが正しいか
ResponseSpring Bootから返ってきたJSON

fetch()のデバッグは、サーバー側ログだけでは足りません。

ブラウザから何を送ったのか、Spring Bootから何が返ったのかを両方見る必要があります。

HTMLフォーム送信とfetch()の違い

比較HTMLフォーム送信fetch()
送信方法form submitJavaScriptでHTTP通信
画面遷移基本的に画面が切り替わる画面を切り替えずに通信できる
送る形式フォームデータが多いJSONが多い
Spring Boot側@RequestParam、@ModelAttribute@RequestBody
向いている場面シンプルな画面遷移部分更新、SPA、API連携

どちらが絶対に正しい、という話ではありません。

画面遷移を前提にしたWebアプリならHTMLフォームで十分なこともあります。

画面の一部だけを更新したい場合や、ReactやVueなどのフロントエンドと連携する場合はfetch()が向いています。

最小構成の対応関係

fetch()とSpring Boot APIの対応関係をまとめます。

JavaScriptSpring Boot意味
fetch("/api/users")@PostMapping("/api/users")URLが対応する
method: "POST"@PostMappingHTTPメソッドが対応する
Content-Type: application/json@RequestBodyJSONとして受け取る
JSON.stringify(requestData)UserCreateRequestJSONをDTOへ変換する
response.json()UserCreateResponse返ってきたJSONをJavaScriptで使う

この対応関係を押さえると、fetch()連携のコードがかなり読みやすくなります。

まとめ

fetch()とSpring Boot APIを連携すると、画面全体を再読み込みせずに、JavaScriptからSpring Bootへデータを送ったり、Spring BootからJSONを受け取ったりできます。

Spring Boot側では@RestController、@RequestBody、ResponseEntityを使います。

JavaScript側ではfetch()、JSON.stringify()、response.json()を使います。

役割使うもの
APIを作る@RestController
JSONを受け取る@RequestBody
JSONを送るfetch()、JSON.stringify()
JSONを読むresponse.json()
ステータスを返すResponseEntity
別オリジンを許可する@CrossOriginまたはCORS設定

一言でまとめるなら、fetch()は「ブラウザからSpring Boot APIへデータを送るJavaScriptの通信係」です。

新人エンジニアは、まず次の流れを覚えてください。

HTMLの入力値を取得する
        ↓
JavaScriptオブジェクトを作る
        ↓
JSON.stringifyでJSON文字列にする
        ↓
fetchでSpring Boot APIへPOSTする
        ↓
@RequestBodyでJava DTOとして受け取る
        ↓
ResponseEntityでJSONを返す
        ↓
response.jsonでJavaScript側が受け取る

今後の学習では、fetch()、Promise、async/await、JSON.stringify、response.json、@RestController、@RequestBody、ResponseEntity、CORS、ブラウザのNetworkタブを順番に学ぶとよいです。まずは小さな登録APIを作り、JavaScriptからPOSTして、返ってきたJSONを画面に表示してみましょう!

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。