前提・実現したいこと
現在、Goを利用してAPIサーバーを実装する練習をしています。ユーザー作成・ユーザー情報取得・ユーザー情報更新の処理を作成し、ユーザー認証とトークンのリフレッシュ、CORS対応をミドルウェアで実装しました。また、サブルーターの機能を利用して、ユーザー認証とトークンのリフレッシュのミドルウェアを必要とするルートと必要としないルートを分けました。
処理が正しく実行できるか、試しにPostmanを利用して/user/createにjsonリクエストを送ったのですが、Postmanのコンソール上で
POST https://localhost:8080/user/create Error: connect ECONNREFUSED 127.0.0.1:8080 Request Headers Content-Type: "application/json" User-Agent: "PostmanRuntime/7.28.0" Accept: "*/*" Postman-Token: "aab94c94-15a7-476d-841a-6afa1d91e124" Host: "localhost:8080" Accept-Encoding: "gzip, deflate, br" Connection: "keep-alive" Request Body { "name": "ABC", "mailAddress": "kefdd", "passWord": "dergrgf" }
というエラーが発生し、接続が中止されてしまいました。
どうすればこのエラーを解決して、正しく実行(例えば/user/createにリクエストを送ればユーザーが作成される)されるようになるでしょうか?
発生している問題・エラーメッセージ
- 現在、Goを利用してAPIサーバーを実装する練習をしている
- ユーザー作成・ユーザー情報取得・ユーザー情報更新の処理を作成し、ユーザー認証とトークンのリフレッシュ、CORS対応をミドルウェアで実装した
- サブルーターの機能を利用して、ユーザー認証とトークンのリフレッシュのミドルウェアを必要とするルートと必要としないルートを分けた
- 処理が正しく実行できるか、試しにPostmanを利用して/user/createにjsonリクエストを送ったところ、Postmanのコンソール上で以下のようなエラーが発生し、接続が中止されてしまった
POST https://localhost:8080/user/create Error: connect ECONNREFUSED 127.0.0.1:8080 Request Headers Content-Type: "application/json" User-Agent: "PostmanRuntime/7.28.0" Accept: "*/*" Postman-Token: "aab94c94-15a7-476d-841a-6afa1d91e124" Host: "localhost:8080" Accept-Encoding: "gzip, deflate, br" Connection: "keep-alive" Request Body { "name": "ABC", "mailAddress": "kefdd", "passWord": "dergrgf" }
- このエラーを解決し、正しく実行(例えば/user/createにリクエストを送ればユーザーが作成される)されるようにしたい
該当のソースコード
main.goのソースコード
Go
1package main 2 3import ( 4 "log" 5 "net/http" 6 7 "Project/handler/userhandler" 8 "Project/middleware" 9 10 "github.com/gorilla/mux" 11) 12 13func main() { 14 15 router := mux.NewRouter() 16 router.Schemes("https") 17 //ユーザー認証をする処理用のルーター 18 authorizationRouteCreator := router.Host("https://localhost:8080").Subrouter() 19 authorizationRouteCreator.Headers("X-Requested-With", "XMLHttpRequest") 20 //ユーザー認証をしない処理用のルーター 21 otherRouteCreator := router.Host("https://localhost:8080").Subrouter() 22 23 //ユーザー認証とトークンのリフレッシュはミドルウェアで行う 24 authorizationRouteCreator.Use(middleware.AuthorizationMiddleware) 25 authorizationRouteCreator.Use(middleware.RefreshMiddleware) 26 //CORS対応もミドルウェアで行う 27 authorizationRouteCreator.Use(middleware.EnableCorsMiddleware) 28 29 //CORS対応もミドルウェアで行う 30 otherRouteCreator.Use(middleware.EnableCorsMiddleware) 31 32 //エンドポイントを用意 33 //ユーザー作成 34 otherRouteCreator.HandleFunc("/user/create", userhandler.UserCreate).Methods("POST") 35 36 //ユーザー情報取得 37 authorizationRouteCreator.HandleFunc("/user/get", userhandler.UserGet(userhandler.UserGetImpl)).Methods("GET") 38 39 //ユーザー情報更新 40 authorizationRouteCreator.HandleFunc("/user/update", userhandler.UserUpdate).Methods("PUT") 41 42 log.Fatal(http.ListenAndServe(":8080", router)) 43 44} 45 46※userhandler.UserCreateはユーザーの新規作成を行う関数。 47※userhandler.UserGetとuserhandler.UserGetImplはユーザー情報取得を行う関数。 48※userhandler.UserUpdateはユーザー情報更新を行う関数。
middleware.goのソースコード
Go
1package middleware 2 3import ( 4 "Project/controller/usercontroller" 5 "Project/handler/handlerutil" 6 "Project/handler/userhandler" 7 "net/http" 8 "time" 9) 10 11//AuthorizationMiddleware : ユーザー認証用のミドルウェア. 12func AuthorizationMiddleware(next http.Handler) http.Handler { 13 return http.HandlerFunc( 14 func(w http.ResponseWriter, r *http.Request) { 15 usercontroller.UserSignIn(w, r) 16 next.ServeHTTP(w, r) 17 }) 18} 19 20//RefreshMiddleware : トークンのリフレッシュ用のミドルウェア. 21func RefreshMiddleware(next http.Handler) http.Handler { 22 return http.HandlerFunc( 23 func(w http.ResponseWriter, r *http.Request) { 24 // トークンの検証(有効かどうか) 25 _, jsonToken, _, err := userhandler.CheckPasetoAuth(w, r) 26 if err != nil { 27 //トークンが無効ならエラーを返す 28 handlerutil.ErrorLoggingAndWriteHeader(w, err, http.StatusUnauthorized) 29 30 } 31 now := time.Now() 32 //トークンの有効期限がまだ切れていない時は何もせずにそのまま返す 33 if jsonToken.Expiration.After(now) { 34 w.WriteHeader(http.StatusOK) 35 36 } else { 37 //有効期限が切れていたらもう一度サインインしてトークンをリフレッシュ 38 usercontroller.UserSignIn(w, r) 39 w.WriteHeader(http.StatusOK) 40 41 } 42 next.ServeHTTP(w, r) 43 }) 44 45} 46 47//EnableCorsMiddleware : CORS対応用のミドルウェア. 48func EnableCorsMiddleware(next http.Handler) http.Handler { 49 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 50 w.Header().Set("Access-Control-Allow-Origin", "*") 51 w.Header().Add("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS") 52 w.Header().Add("Access-Control-Allow-Headers", "*") 53 //プリフライトリクエストの場合の処理 54 if r.Method == "OPTIONS" { 55 w.WriteHeader(http.StatusOK) 56 return 57 } 58 next.ServeHTTP(w, r) 59 60 }) 61 62} 63 64※userhandler.CheckPasetoAuthはトークンの検証を行う関数。 65※usercontroller.UserSignInはユーザーのサインインを行う関数。
handlerutil.goのソースコード
Go
1package handlerutil 2 3import ( 4 "encoding/json" 5 "log" 6 "net/http" 7 "errors" 8) 9 10//ParseJsonBody : JSONボディから必要なデータを取得. 11func ParseJsonBody(r *http.Request, decordtarget interface{}) error { 12 err := json.NewDecoder(r.Body).Decode(&decordtarget) 13 if err != nil { 14 return errors.New("the json body is incorrect!") 15 } else { 16 return nil 17 } 18} 19 20//ErrorLoggingAndWriteHeader : errのnilチェック+Log吐き+httpステータスをw.WriteHeader()する. 21func ErrorLoggingAndWriteHeader(w http.ResponseWriter, err error, httpStatus int) { 22 log.Print(err.Error()) 23 w.WriteHeader(httpStatus) 24 25}
Postmanで送信したリクエストのjsonボディ
json
1{ 2 "name": "ABC", 3 "mailAddress": "kefdd", 4 "passWord": "dergrgf" 5}
Postmanで送信したリクエストの送信先:https://localhost:8080/user/create
Postmanで送信したリクエストのHTTPメソッド:POST
Postmanでの authorization methodのType:Bearer Token
試したこと
以下のサイトを参考にして、ソースコードを修正した上で、Postmanでjsonリクエストを送ってみましたが、依然として同様のエラーが発生しました。
https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a
https://gist.github.com/danesparza/eb3a63ab55a7cd33923e
https://mj-go.in/golang/crud-rest-api-with-gorilla-mux
https://qiita.com/unhurried/items/8bab83747130906885b7
補足情報(FW/ツールのバージョンなど)
Goのバージョン:1.16
gorilla/muxのバージョン:v1.8.0
Postmanのバージョン:v8.3.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。