問題を切り分け してみましょう。unexpected end of JSON input
というエラーメッセージはJSONの構文が間違っているときに起こります。
まずは string(body)
などとしてフロントエンドからリクエストされるJSON文字列が意図したものか確かめてみましょう。
例えば以下のような単純なAPIは機能します。
go
1package main
2
3import (
4 "encoding/json"
5 "io/ioutil"
6 "log"
7 "net/http"
8)
9
10type InputSidJsonSchema struct {
11 Data1 string `json:"data1"`
12 Data2 string `json:"data2"`
13}
14
15func sampleHandler(w http.ResponseWriter, r *http.Request) {
16 body, err := ioutil.ReadAll(r.Body)
17 if err != nil {
18 log.Printf("read all: %v", err)
19 return
20 }
21
22 jsonBytes := body
23
24 // 意図した文字列がフロントエンドからリクエストされているか確認
25 log.Printf("request body=%s\n", string(body))
26
27 data := new(InputSidJsonSchema)
28 if err := json.Unmarshal(jsonBytes, data); err != nil {
29 log.Printf("unmarshal json: %v", err)
30 return
31 }
32
33 log.Printf("data=%+v", data)
34}
35
36func main() {
37 http.HandleFunc("/sample", sampleHandler)
38 if err := http.ListenAndServe(":8080", nil); err != nil {
39 log.Fatal(err)
40 }
41}
$ curl -i -H "Content-Type: application/json" -d '{"data1": "xxxxxxxx@gmail.com", "data2": "yyyyyyyy"}' http://localhost:8080/sample
HTTP/1.1 200 OK
Date: Sat, 02 Jan 2021 08:10:19 GMT
Content-Length: 0
2021/01/02 17:10:19 request body={"data1": "xxxxxx.xx@gmail.com", "data2": "yyyyyyyy"}
2021/01/02 17:10:19 data=&{Data1:xxxxxx.xx@gmail.com Data2:yyyyyyyy}