我把重点放在服务器端,因为问题出在服务器端。
解决方案
我换了
main.go
通过
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"log"
"net/http"
)
type LoginDetails struct {
Username string `json:"username"`
Password string `json:"password"`
}
func login(w http.ResponseWriter, req *http.Request) {
var loginData LoginDetails
err := json.NewDecoder(req.Body).Decode(&loginData)
if err != nil {
panic(err)
}
_, err = w.Write([]byte("ok\n"))
if err != nil{
panic(err)
}
}
func main() {
fmt.Println("Starting server at http://localhost:3000...")
router := mux.NewRouter()
router.HandleFunc("/login", login) // Registering /login before / seems to do the trick
router.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/dist/static")))
headersOk := handlers.AllowedHeaders([]string{"Authorization"})
methodsOk := handlers.AllowedMethods([]string{"GET", "POST", "OPTIONS"})
log.Fatal(http.ListenAndServe(":3000", handlers.CORS(headersOk, methodsOk)(router)))
}
溶液试验
$ curl -X POST -H "Content-Type: application/json" -d '{"username": "user", "password": "p4ssw0rd"}' http://127.0.0.1:3000/login
ok
解释
根据
mux documentation
:
路由将按照它们添加到路由器的顺序进行测试。如果两个
路线匹配,第一个获胜:
以下是与您的案例相匹配的示例:
r := mux.NewRouter()
r.HandleFunc("/specific", specificHandler)
r.PathPrefix("/").Handler(catchAllHandler)
您的“/”处理程序似乎在“/”登录”处理程序之前捕获了请求。