Heim  >  Artikel  >  Backend-Entwicklung  >  Die Verwendung von POST zum Hinzufügen desselben Endpunkts und verschiedener Abfragen zu GET führt zu inkonsistenten Fehlermeldungen

Die Verwendung von POST zum Hinzufügen desselben Endpunkts und verschiedener Abfragen zu GET führt zu inkonsistenten Fehlermeldungen

WBOY
WBOYnach vorne
2024-02-11 20:50:11767Durchsuche

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

php-Editor Banana ist hier, um eine häufig gestellte Frage für alle zu beantworten: Wenn Sie POST verwenden, um denselben Endpunkt und unterschiedliche Abfragen zu GET hinzuzufügen, kann es zu inkonsistenten Fehlermeldungen kommen. In der Webentwicklung sind GET und POST häufig verwendete HTTP-Anfragemethoden zur Übermittlung von Daten an den Server. Die GET-Methode hängt die Daten an die URL an, während die POST-Methode die Daten im Anfragetext kapselt. Wenn wir eine POST-Anfrage zum gleichen Endpunkt einer GET-Anfrage hinzufügen, können inkonsistente Fehlermeldungen auftreten, wenn die Abfrageparameter unterschiedlich sind. Dies liegt daran, dass der Server die Anfrage basierend auf der Anfragemethode und den Abfrageparametern verarbeitet. Unterschiedliche Abfrageparameter können dazu führen, dass der Server unterschiedliche Ergebnisse zurückgibt. Daher müssen wir bei der Verwendung von POST- und GET-Anfragen auf die Konsistenz von Endpunkten und Abfrageparametern achten, um unerwartete Fehlermeldungen zu vermeiden.

Frageninhalt

Wenn Sie dieselbe Route mit unterschiedlichen Methoden hinzufügen, ist die Antwort jedes Methodenabfrage-Get-Aufrufs unterschiedlich, aber da die andere Methode post ist, sollte dies nicht beeinträchtigt werden.

Per Post: Spielplatz: 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)

}

Erwartete 404, tatsächliche 405

Beim Löschen eines Beitrags Spielplatz: 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)

}

Das Ergebnis ist 404

Bei Get-Anfragen sollten Routing und Ergebnisse konsistent sein. 404-s

Ich bin neugierig, ob jemand schon einmal auf dieses Problem gestoßen ist?

Problemumgehung

Der Router versucht, basierend auf den Pfad- und Abfrageparametern eine Übereinstimmung zu finden. Die Get-Route stimmte nicht überein, da die Parameter der Abfragezeichenfolge nicht den Anforderungen entsprachen.

Aber dieser Pfad stimmt mit der Post-Route überein, da diese Route diese Abfrageparameter nicht berücksichtigt. Überprüfen Sie dann die Anforderungsmethode und stellen Sie fest, dass sie nicht mit der Route übereinstimmt. Daher wird 405 method not allowed zurückgegeben (die Route verfügt über einen Handler, aber die Methode ist anders).

Sie können das gewünschte Verhalten erzielen, indem Sie einen Catch-All-Get-Handler für denselben Pfad hinzufügen:

// 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)

}

Das obige ist der detaillierte Inhalt vonDie Verwendung von POST zum Hinzufügen desselben Endpunkts und verschiedener Abfragen zu GET führt zu inkonsistenten Fehlermeldungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen