php小編香蕉在此為大家解答一個常見問題:使用 POST 添加到 GET 相同的端點和不同的查詢,最終可能會出現不一致的錯誤訊息。在Web開發中,GET和POST是常用的HTTP請求方法,用來傳遞資料到伺服器。 GET方法將資料附加在URL中,而POST方法將資料封裝在請求正文中。當我們將POST請求新增至GET請求的相同端點時,如果查詢參數不同,可能會導致錯誤訊息不一致的情況發生。這是因為伺服器會根據請求方法和查詢參數來處理請求,不同的查詢參數可能會導致伺服器傳回不同的結果。因此,在使用POST和GET請求時,我們需要注意端點和查詢參數的一致性,以避免意外錯誤訊息。
當使用不同的方法新增相同的路由時,每個方法查詢get 呼叫的回應是不同的,但由於另一個方法是post,所以它應該不受影響。
透過帖子: 遊樂場:https://go.dev/play/p/xzoakpehggy
// you can edit this code! // click here and start typing. package main import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "time" "github.com/gorilla/mux" ) func main() { r := mux.newrouter() r.handlefunc("/api/v2", func(w http.responsewriter, r *http.request) { // an example api handler fmt.fprintf(w, "you made a post request") json.newencoder(w).encode(map[string]bool{"ok": true}) }).methods("post") r.handlefunc("/api/v2", func(w http.responsewriter, r *http.request) { // an example api handler fmt.fprintf(w, "you made a get request") json.newencoder(w).encode(map[string]bool{"ok": true}) }). queries("from", "{from:[0-9]+}", "to", "{to:[0-9]+}").methods("get") srv := &http.server{ handler: r, addr: "127.0.0.1:8000", // good practice: enforce timeouts for servers you create! writetimeout: 15 * time.second, readtimeout: 15 * time.second, } go srv.listenandserve() req2 := httptest.newrequest("get", "/api/v2?from=3&to=-5", nil) out2 := httptest.newrecorder() r.servehttp(out2, req2) fmt.println(out2.code) fmt.println(out2) }
預期為 404,實際為 405
刪除 post 時 遊樂場:https://go.dev/play/p/exif00_wrfw
// You can edit this code! // Click here and start typing. package main import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "time" "github.com/gorilla/mux" ) func main() { r := mux.NewRouter() r.HandleFunc("/api/v2", func(w http.ResponseWriter, r *http.Request) { // an example API handler fmt.Fprintf(w, "You made a GET request") json.NewEncoder(w).Encode(map[string]bool{"ok": true}) }). Queries("from", "{from:[0-9]+}", "to", "{to:[0-9]+}").Methods("GET") srv := &http.Server{ Handler: r, Addr: "127.0.0.1:8000", // Good practice: enforce timeouts for servers you create! WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } go srv.ListenAndServe() req2 := httptest.NewRequest("GET", "/api/v2?from=3&to=-5", nil) out2 := httptest.NewRecorder() r.ServeHTTP(out2, req2) fmt.Println(out2.Code) }
結果為 404
對於 get 請求,路由和結果應該一致。 404-s
我很好奇以前是否有人遇到過這個問題?
路由器將嘗試根據路徑和查詢參數尋找匹配項。由於查詢字串參數不符合要求,導致 get 路由未符合。
但是路徑與 post 路由匹配,因為該路由不關心這些查詢參數。然後檢查請求方法,它與路由不匹配,因此返回 405 method not allowed
(該路由有一個處理程序,但方法不同)。
您可以透過為相同路徑新增包羅萬象的 get 處理程序來獲得所需的行為:
// You can edit this code! // Click here and start typing. package main import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "time" "github.com/gorilla/mux" ) func main() { r := mux.NewRouter() r.HandleFunc("/api/v2", func(w http.ResponseWriter, r *http.Request) { // an example API handler fmt.Fprintf(w, "You made a POST request") json.NewEncoder(w).Encode(map[string]bool{"ok": true}) }).Methods("POST") r.HandleFunc("/api/v2", func(w http.ResponseWriter, r *http.Request) { // an example API handler fmt.Fprintf(w, "You made a GET request") json.NewEncoder(w).Encode(map[string]bool{"ok": true}) }). Queries("from", "{from:[0-9]+}", "to", "{to:[0-9]+}"). Methods("GET") r.HandleFunc("/api/v2", func(w http.ResponseWriter, r *http.Request) { http.Error(w, "", http.StatusNotFound) }).Methods("GET") srv := &http.Server{ Handler: r, Addr: "127.0.0.1:8000", // Good practice: enforce timeouts for servers you create! WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } go srv.ListenAndServe() req2 := httptest.NewRequest("GET", "/api/v2?from=3&to=-5", nil) out2 := httptest.NewRecorder() r.ServeHTTP(out2, req2) fmt.Println(out2.Code) }
以上是使用 POST 新增到 GET 相同的端點和不同的查詢最終會出現不一致的錯誤訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!