前提・実現したいこと
Goを利用してAPIサーバーを作成中です。
リクエストをjson形式で受け取り、その中にあるメールアドレスとパスワードを照合してDBにある時のみ認証を通す処理を書こうとしています。
ある程度書き上げた上で正しく実行できるか、実際にPostmanでリクエストを送ってテストしてみたのですが、実行すると
>go run main.go C:/Users/(ユーザー名)/Documents/Projects/handler/handlerutil/handlerutil.go:21: EOF
というエラーが発生しました。
原因を調べたところ、JSONボディのパースがうまくいっていないことが原因だと分かったのですが、解決方法が分かりません。
どうすればEOFエラーを解決して、正しく認証を通して意図したリクエストを送れるようになるでしょうか?
発生している問題・エラーメッセージ
- リクエストをjson形式で受け取り、その中にあるメールアドレスとパスワードを照合してDBにある時のみ認証を通す処理を書こうとしている
- ある程度書き上げた上で正しく実行できるか、実際にリクエストを送ってテストしてみたところ、
>go run main.go C:/Users/(ユーザー名)/Documents/Project/handler/handlerutil/handlerutil.go:21: EOF
というエラーが発生した。
- このエラーを解決し、正しく認証を通して意図したリクエストを送れるようにしたい。
該当のソースコード
handlerutil.goのソースコード:
Go
1package handlerutil 2 3import ( 4 "encoding/json" 5 "log" 6 "net/http" 7) 8 9//ParseJsonBody : JSONボディから必要なデータを取得. 10func ParseJsonBody(r *http.Request, decordtarget interface{}) error { 11 err := json.NewDecoder(r.Body).Decode(&decordtarget) 12 if err != nil { 13 return err 14 } else { 15 return nil 16 } 17} 18 19//ErrorLoggingAndWriteHeader : errのnilチェック+Log吐き+httpステータスをw.WriteHeader()する. 20func ErrorLoggingAndWriteHeader(w http.ResponseWriter, err error, httpStatus int) { 21 log.Println(err) 22 w.WriteHeader(httpStatus) 23 24}
userhandler.goのソースコード:
Go
1package userhandler 2 3import ( 4 "Project/controller/usercontroller" 5 "Project/model/usermodel" 6 "Project/handler/handlerutil" 7 "net/http" 8) 9 10//UserSignIn : ユーザーのサインイン処理を行う. 11func UserSignIn(w http.ResponseWriter, r *http.Request){ 12 loginUser := usermodel.User{} 13 //JSONボディから必要なデータを取得 14 err := handlerutil.ParseJsonBody(r, &loginUser) 15 if err != nil { 16 handlerutil.ErrorLoggingAndWriteHeader(w, err, http.StatusBadRequest) 17 return 18 } 19 20 //メールアドレスとパスワードを照合+DBにある時のみサインインを通す 21 user, err := usercontroller.UserAuthorization(loginUser.MailAddress, loginUser.PassWord) 22 if err != nil { 23 //メールアドレスとパスワードの組がDBになければエラーを返す 24 handlerutil.ErrorLoggingAndWriteHeader(w, err, http.StatusUnauthorized) 25 return 26 } 27 28 29} 30※usercontroller.UserAuthorization()はメールアドレスとパスワードを照合し、DBにある時のみサインインを通す関数。この関数でエラーが発生していないことは確認済み。
usermodel.goのソースコード:
Go
1package usermodel 2 3//User: ユーザー情報を管理. 4type User struct { 5 Id string `db:"ID, primarykey"` //ユーザーID 6 Name string `db:"name" json:"name"` //ユーザー名 7 MailAddress string `db:"mailAddress" json:"mailAddress"` //メールアドレス 8 PassWord string `db:"password" json:"passWord"` //パスワード 9}
リクエストとして送ったjsonボディ
json
1{ 2 "id": "189680eb-b2de-11eb-9e65-00d861e5f8f0", 3 "mailAddress": "DEF", 4 "passWord": "HIJ" 5}
usersテーブルの中身:
ID | name | mailAddress | password |
---|---|---|---|
14cae32b-b2f5-11eb-8fde-00d861e5f8f0 | DEF | 111 | 222 |
189680eb-b2de-11eb-9e65-00d861e5f8f0 | ABC | DEF | HIJ |
試したこと
エラーメッセージをよく読んで上で自分で色々と調べた結果、handlerutil.ParseJsonBody()
に問題があることは突き止めたのですが、どう解決すれば良いか分かりません。
補足情報(FW/ツールのバージョンなど)
Goのバージョン:1.16
gorilla/muxのバージョン:v1.8.0
Postmanのバージョン:v8.3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/13 05:18