首頁 >後端開發 >Golang >使用 POST 新增到 GET 相同的端點和不同的查詢最終會出現不一致的錯誤訊息

使用 POST 新增到 GET 相同的端點和不同的查詢最終會出現不一致的錯誤訊息

WBOY
WBOY轉載
2024-02-11 20:50:11834瀏覽

使用 POST 添加到 GET 相同的端点和不同的查询最终会出现不一致的错误消息

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除