Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan POST untuk menambah kepada GET titik akhir yang sama dan pertanyaan yang berbeza berakhir dengan mesej ralat yang tidak konsisten

Menggunakan POST untuk menambah kepada GET titik akhir yang sama dan pertanyaan yang berbeza berakhir dengan mesej ralat yang tidak konsisten

WBOY
WBOYke hadapan
2024-02-11 20:50:11767semak imbas

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

editor php Banana berada di sini untuk menjawab soalan biasa untuk semua orang: menggunakan POST untuk menambah kepada MENDAPATKAN titik akhir yang sama dan pertanyaan berbeza, anda mungkin mendapat mesej ralat yang tidak konsisten. Dalam pembangunan web, GET dan POST biasanya digunakan kaedah permintaan HTTP untuk menghantar data ke pelayan. Kaedah GET menambahkan data pada URL, manakala kaedah POST merangkum data dalam badan permintaan. Apabila kami menambah permintaan POST pada titik akhir yang sama bagi permintaan GET, mesej ralat yang tidak konsisten mungkin berlaku jika parameter pertanyaan berbeza. Ini kerana pelayan memproses permintaan berdasarkan kaedah permintaan dan parameter pertanyaan yang berbeza boleh menyebabkan pelayan mengembalikan hasil yang berbeza. Oleh itu, apabila menggunakan permintaan POST dan GET, kita perlu memberi perhatian kepada ketekalan titik akhir dan parameter pertanyaan untuk mengelakkan mesej ralat yang tidak dijangka.

Kandungan soalan

Apabila menambah laluan yang sama menggunakan kaedah yang berbeza, tindak balas setiap pertanyaan kaedah mendapatkan panggilan adalah berbeza, tetapi memandangkan kaedah lain adalah pos, ia tidak sepatutnya terjejas.

Melalui pos: Taman permainan: 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)

}

Dijangka 404, sebenar 405

Apabila memadamkan siaran Taman permainan: 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)

}

Hasilnya ialah 404

Untuk mendapatkan permintaan, laluan dan keputusan hendaklah konsisten. 404-s

Saya tertanya-tanya adakah sesiapa pernah mengalami masalah ini sebelum ini?

Penyelesaian

Penghala akan cuba mencari padanan berdasarkan laluan dan parameter pertanyaan. Laluan get tidak dipadankan kerana parameter rentetan pertanyaan tidak memenuhi keperluan.

Tetapi laluan itu sepadan dengan laluan pos kerana laluan itu tidak mengambil berat tentang parameter pertanyaan tersebut. Kemudian menyemak kaedah permintaan, ia tidak sepadan dengan laluan, jadi 405 method not allowed dikembalikan (laluan mempunyai pengendali, tetapi kaedahnya berbeza).

Anda boleh mendapatkan gelagat yang diingini dengan menambahkan pengendali dapatkan semua untuk laluan yang sama:

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

}

Atas ialah kandungan terperinci Menggunakan POST untuk menambah kepada GET titik akhir yang sama dan pertanyaan yang berbeza berakhir dengan mesej ralat yang tidak konsisten. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam