🤖

テストデータを返すAPIを作る

2024/12/04に公開

前置き

本記事は、みすてむずアドカレ レシピの4日目の記事です。

みすてむずアドカレ2024の一覧

はじまり

レシピアドカレ4日目、始まるよ〜 (レシピとは)
ということで、昨日はGo言語でテストデータを生成させてましたが、今日はAPIを作ってみたいと思います。
「関連性がない気がするんだが...」とか思う方もいるかも知れませんが、今日は昨日のテストデータを返すを活用して、テストデータを思い通りに出力できるAPIを作っていきます!

0. Setup

  • 昨日のsetupをする。
  • go get "github.com/go-chi/chi/v5"

1. Hello World from API

Hello World!を返すAPIをとりあえず作ってみます。

package main

import (
	"net/http"

	"github.com/go-chi/chi/v5"
)

func main() {
	r := chi.NewRouter()
	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World!"))
	})
	http.ListenAndServe(":3000", r)
}

これで、実行してみましょう!

$ go run main.go

何も出なくて心配になるかも知れませんが、ブラウザー等でhttp://localhost:3000/にアクセスしてみて...

Hello World!

と表示されていれば成功です!
(もしも、ここでこの表示が出ない場合、0.Setupからやり直してみてください。)

2. 1の説明

部分ごとに説明していきます。

mainパッケージだよ〜っていう宣言

package main

今回使用する、net/httpgo-chi/chiのライブラリをインポート

import (
	"net/http"

	"github.com/go-chi/chi/v5"
)

ここからがややこしいところ...

func main() {
	r := chi.NewRouter()
	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World!"))
	})
	http.ListenAndServe(":3000", r)
}

rという変数名でchiのルータを新しく作っています。

r := chi.NewRouter()

/にアクセスされた時に、Hello World!って返してね〜っていう処理がここです。

	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World!"))
	})

最後に、ここでサーバーを起動させて、3000番ポートで開いています。

	http.ListenAndServe(":3000", r)

3. テストデータを返せるようにしたい!

やることは簡単!
APIが呼ばれた時に

  1. テストデータを生成
  2. テストデータをjsonに変換
  3. データを返す
    の3工程だけです。
    このうち、1は昨日の記事で作成したので、コピペしてきましょう!

importfunc main() {の間に下のコードをコピペ

type FakeUserData struct {
	Name             string
	Email            string
	Phone            string
	Country          string
	City             string
	CreditCardNumber string
}

func generateFakeData() FakeUserData {
	return FakeUserData{
		Name:             gofakeit.Name(),
		Email:            gofakeit.Email(),
		Phone:            gofakeit.Phone(),
		Country:          gofakeit.Country(),
		City:             gofakeit.City(),
		CreditCardNumber: gofakeit.CreditCard().Number,
	}
}

忘れずに、

"github.com/brianvoe/gofakeit/v7"

importの中に書き込んでおきましょう!

この時点でのコード全体
package main

import (
	"net/http"

	"github.com/brianvoe/gofakeit/v7"
	"github.com/go-chi/chi/v5"
)

type FakeUserData struct {
	Name             string
	Email            string
	Phone            string
	Country          string
	City             string
	CreditCardNumber string
}

func generateFakeData() FakeUserData {
	return FakeUserData{
		Name:             gofakeit.Name(),
		Email:            gofakeit.Email(),
		Phone:            gofakeit.Phone(),
		Country:          gofakeit.Country(),
		City:             gofakeit.City(),
		CreditCardNumber: gofakeit.CreditCard().Number,
	}
}

func main() {
	r := chi.NewRouter()
	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World!"))
	})
	http.ListenAndServe(":3000", r)
}

これから、テストデータを返す部分を作っていきましょう!

4. テストデータを返してみる

流れとしては

  1. ``/`にアクセスされる
  2. テストデータを生成する
  3. テストデータをjsonに変換する
  4. レスポンスとして変換したjsonを返す
    になると思います。

前の章でテストデータの生成までは行ったので、jsonに変換していきたいと思います。
Go言語には、encoding/jsonという標準ライブラリがあるので、それでお手軽に変換してみます。

	_j, err := json.Marshal(generateFakeData())
	if err != nil {
		panic(err)
	}

これでヨシ!
(詳しい説明は、昨日の記事をみてください...)

encoding/json以外の外部ライブラリについて

もちろん、外部のライブラリはたくさんありますが、まずは標準ライブラリでやって...
それでも足りなかったら外部ライブラリという流れの方がいいかなと思って、今回は外部のものは使用していません。

この時点でのコード全体
package main

import (
	"encoding/json"
	"net/http"

	"github.com/brianvoe/gofakeit/v7"
	"github.com/go-chi/chi/v5"
)

type FakeUserData struct {
	Name             string
	Email            string
	Phone            string
	Country          string
	City             string
	CreditCardNumber string
}

func generateFakeData() FakeUserData {
	return FakeUserData{
		Name:             gofakeit.Name(),
		Email:            gofakeit.Email(),
		Phone:            gofakeit.Phone(),
		Country:          gofakeit.Country(),
		City:             gofakeit.City(),
		CreditCardNumber: gofakeit.CreditCard().Number,
	}
}

func main() {
	r := chi.NewRouter()
	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		_j, err := json.Marshal(generateFakeData())
		if err != nil {
			panic(err)
		}
		w.Write([]byte("Hello World!"))
	})
	http.ListenAndServe(":3000", r)
}

5. テストデータを返せた!

最後に、テストデータを返してみましょう。
いま、Hello World!を返している一文をこんな感じで変更してみます。

変更前

w.Write([]byte("Hello World!"))

変更後

w.Write(_j)

今のままでは、普通のテキストを返していると認識されてしまっているので...
r.Getの下にこの一文を追加しましょう!

w.Header().Set("Content-Type", "application/json")
詳しい説明

Content-Typeapplication/jsonに設定することで、ブラウザー側にデータが届いた時に、json形式で読み込んでくれるようになります。
Content-Typeには、他にも

  • text/html
  • text/css
  • image/png
  • audio/wav
  • audio/mp3
  • etc...
    と、たくさんありますので、適切なものを設定してあげましょう。
コード全体
package main

import (
	"encoding/json"
	"net/http"

	"github.com/brianvoe/gofakeit/v7"
	"github.com/go-chi/chi/v5"
)

type FakeUserData struct {
	Name             string
	Email            string
	Phone            string
	Country          string
	City             string
	CreditCardNumber string
}

func generateFakeData() FakeUserData {
	return FakeUserData{
		Name:             gofakeit.Name(),
		Email:            gofakeit.Email(),
		Phone:            gofakeit.Phone(),
		Country:          gofakeit.Country(),
		City:             gofakeit.City(),
		CreditCardNumber: gofakeit.CreditCard().Number,
	}
}

func main() {
	r := chi.NewRouter()
	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_j, err := json.Marshal(generateFakeData())
		if err != nil {
			panic(err)
		}
		w.Write(_j)
	})
	http.ListenAndServe(":3000", r)
}

これで実行してみると...

$ go run main.go

何も表示されませんが、ブラウザー等でhttp://localhost:3000/にアクセスすると、jsonがバーっと出てくると思います!

表示例
{"Name":"Aubree Schulist","Email":"milfordkunze@eichmann.net","Phone":"2618515096","Country":"Azerbaijan","City":"Chesapeake","CreditCardNumber":"4133303193587763"}

再読み込みして、毎回違う名前が出てきたら成功です!お疲れさまでした。

6. おわり

いかがでしたでしょうか。昨日のテストデータの生成に引き続き、今日はAPIの作成...
(じゃあ明日はどうなるんだ?)

まだまだ、アドカレは続きますので、お楽しみに〜

Discussion