ฉันใช้http
แพ็คเกจจาก Go เพื่อจัดการกับคำขอ POST ฉันจะเข้าถึงและแยกวิเคราะห์เนื้อหาของสตริงการสืบค้นจากRequest
วัตถุได้อย่างไร ฉันไม่พบคำตอบจากเอกสารอย่างเป็นทางการ
ฉันใช้http
แพ็คเกจจาก Go เพื่อจัดการกับคำขอ POST ฉันจะเข้าถึงและแยกวิเคราะห์เนื้อหาของสตริงการสืบค้นจากRequest
วัตถุได้อย่างไร ฉันไม่พบคำตอบจากเอกสารอย่างเป็นทางการ
คำตอบ:
QueryString คือตามคำจำกัดความใน URL คุณสามารถเข้าถึง URL ของคำขอโดยใช้req.URL
( doc ) ออบเจ็กต์ URL มีQuery()
เมธอด ( doc ) ที่ส่งคืนValues
ประเภทซึ่งเป็นเพียงmap[string][]string
พารามิเตอร์ QueryString
หากสิ่งที่คุณกำลังมองหาคือข้อมูล POST ตามที่ส่งมาในรูปแบบ HTMLนี่คือคู่คีย์ - ค่าในเนื้อหาคำขอ (โดยปกติ) คำตอบของคุณถูกต้องว่าคุณสามารถโทรParseForm()
แล้วใช้req.Form
ฟิลด์เพื่อรับแผนที่ของคู่คีย์ - ค่า แต่คุณสามารถเรียกFormValue(key)
เพื่อรับค่าของคีย์เฉพาะได้ สิ่งนี้จะเรียกParseForm()
ถ้าจำเป็นและรับค่าโดยไม่คำนึงถึงวิธีการส่ง (เช่นในสตริงการสืบค้นหรือในเนื้อหาคำขอ)
req.URL.RawQuery
ส่งคืนทุกอย่างหลังจาก?
คำขอ GET หากช่วยได้
นี่คือตัวอย่างที่ชัดเจนมากขึ้นเกี่ยวกับวิธีเข้าถึงพารามิเตอร์ GET Request
วัตถุจะมีวิธีการที่จะแยกวิเคราะห์พวกเขาออกมาให้คุณเรียกว่าแบบสอบถาม :
สมมติว่าขอ URL เช่นhttp: // host: port / something? param1 = b
func newHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("GET params were:", r.URL.Query())
// if only one expected
param1 := r.URL.Query().Get("param1")
if param1 != "" {
// ... process it, will be the first (only) if multiple were given
// note: if they pass in like ?param1=¶m2= param1 will also be "" :|
}
// if multiples possible, or to process empty values like param1 in
// ?param1=¶m2=something
param1s := r.URL.Query()["param1"]
if len(param1s) > 0 {
// ... process them ... or you could just iterate over them without a check
// this way you can also tell if they passed in the parameter as the empty string
// it will be an element of the array that is the empty string
}
}
นอกจากนี้โปรดทราบว่า "คีย์ในแมปค่า [เช่น Query () return value] นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่"
r.URL.Query().Get("moviename")
เพื่อหลีกเลี่ยงความผิดพลาดร้ายแรงนี้)
Get
วิธีนี้จะส่งกลับค่าแรกเท่านั้นหากมีหลายตัวดังนั้นนี่คือตัวอย่างของมากกว่า ข้อมูลที่เป็นประโยชน์ขอขอบคุณ!
Values.Get()
golang.org/pkg/net/url/#Valuesnil
นี่คือตัวอย่างการใช้งานง่ายๆ:
package main
import (
"io"
"net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
io.WriteString(res, "name: "+req.FormValue("name"))
io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}
func main() {
http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
queryParamDisplayHandler(res, req)
})
println("Enter this in your browser: http://localhost:8080/example?name=jenny&phone=867-5309")
http.ListenAndServe(":8080", nil)
}
มีสองวิธีในการรับพารามิเตอร์แบบสอบถาม:
ในกรณีที่สองเราต้องระมัดระวังเนื่องจากพารามิเตอร์ของร่างกายจะมีความสำคัญเหนือกว่าพารามิเตอร์การค้นหา คำอธิบายแบบเต็มเกี่ยวกับการรับพารามิเตอร์แบบสอบถามสามารถพบได้ที่นี่
https://golangbyexample.com/net-http-package-get-query-params-golang
คำด้านล่างมาจากเอกสารอย่างเป็นทางการ
แบบฟอร์มที่มีข้อมูลในแบบฟอร์มแจงรวมทั้งทั้งพารามิเตอร์การค้นหาข้อมูลของ URLและโพสต์หรือข้อมูลในแบบฟอร์ม PUT ฟิลด์นี้จะพร้อมใช้งานหลังจากเรียก ParseForm เท่านั้น
ดังนั้นโค้ดตัวอย่างด้านล่างจะใช้งานได้
func parseRequest(req *http.Request) error {
var err error
if err = req.ParseForm(); err != nil {
log.Error("Error parsing form: %s", err)
return err
}
_ = req.Form.Get("xxx")
return nil
}
r.FormValue("id")
เพื่อดึงข้อมูลพารามิเตอร์การค้นหาคุณจะไม่สามารถส่ง i ผ่านข้อมูลแบบฟอร์มใน cURL ได้ (กล่าวคือcurl 0.0.0.0:8888 -d id=foobar
จะไม่ทำงาน) คุณต้องส่งผ่านพารามิเตอร์แบบสอบถาม (curl 0.0.0.0:8888?id=foobar
)