テストデータを返すAPIを作る
前置き
本記事は、みすてむずアドカレ レシピ
の4日目の記事です。
みすてむずアドカレ2024の一覧
- みすてむずアドカレ
- みすてむずアドカレ その2
- みすてむずアドカレ レシピ ← コレの4日目
はじまり
レシピアドカレ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/http
とgo-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が呼ばれた時に
- テストデータを生成
- テストデータをjsonに変換
- データを返す
の3工程だけです。
このうち、1は昨日の記事で作成したので、コピペしてきましょう!
import
とfunc 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. テストデータを返してみる
流れとしては
- ``/`にアクセスされる
- テストデータを生成する
- テストデータをjsonに変換する
- レスポンスとして変換した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-Type
をapplication/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