Go'nun http paketinde, bir POST isteğindeki sorgu dizesini nasıl alırım?


114

httpPOST isteğiyle ilgilenmek için Go'daki paketi kullanıyorum . Nesneden sorgu dizesinin içeriğine nasıl erişebilir ve ayrıştırabilirim Request? Cevabı resmi belgelerde bulamıyorum.


Unutulmaması gereken bir şey, istek göndermek için cURL kullanıyorsanız ve r.FormValue("id")bir sorgu parametresi almak için kullanıyorsanız , i'yi cURL'deki form verileri aracılığıyla gönderemezsiniz (yani curl 0.0.0.0:8888 -d id=foobarçalışmayacaktır). Sorgu parametreleri ( curl 0.0.0.0:8888?id=foobar) aracılığıyla göndermelisiniz .

Yanıtlar:


145

Bir QueryString, tanımı gereği URL'nin içindedir. req.URL( Doc ) kullanarak isteğin URL'sine erişebilirsiniz . URL nesnesinin bir Query()yöntemi vardır ( docValues , yalnızca map[string][]stringQueryString parametrelerinden biri olan bir türü döndüren ) vardır .

Aradığınız şey bir HTML formu tarafından gönderilen POST verileriyse , bu (genellikle) istek gövdesindeki bir anahtar / değer çiftidir. Cevabınızda haklısınız, arayabilir ParseForm()ve ardından req.Formanahtar / değer çiftlerinin haritasını almak için alanı kullanabilirsiniz , ancak FormValue(key)belirli bir anahtarın değerini almak için de arayabilirsiniz . Bu, ParseForm()gerekirse çağırır ve nasıl gönderildiklerine bakılmaksızın değerleri alır (yani sorgu dizesinde veya istek gövdesinde).


2
Hassasiyet için teşekkürler.
Fabien

2
'Req.FormValue (key)' yöntemini daha hızlı buluyorum ve url'yi önceden ayrıştırmak için gereken tüm kodu sizin için yapıyorum.
OnlyAngel

6
req.URL.RawQueryYardımcı olursa ?, bir GET isteğinden sonraki her şeyi döndürür .
kouton

Req.formValue ("bir_alan") kiralama sırasında bir kez çağrılmadıkça req.Form'un boş dizi olduğunu ilginç buldum.
Qian Chen

Çok teşekkürler! @kouton
Aditya Varma

127

İşte GET parametrelerine nasıl erişileceğine dair daha somut bir örnek. RequestNesne aradığınız için onları dışarı ayrıştırır bir yöntemi vardır Sorgu :

Http: // host: port / bir şey gibi bir istek URL'si varsayarsak ? 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=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=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
  }    
}

Ayrıca "Değerler eşlemesindeki [yani Query () dönüş değeri] anahtarların büyük / küçük harfe duyarlı olduğunu unutmayın."


4
Daha önce bahsedilen ve sadece bunu yapma belgelerine bağlanan önceki bir cevap (ve istenen alan yoksa, sınır dışı bir dilim referansı ile paniğe kapılacak bir örneğe sahip değildir, r.URL.Query().Get("moviename")bu ölümcül hatayı önlemek için kullanın ).
Dave C

1
Bilgi için teşekkürler. Evet, dokümanlar benim için biraz kafa karıştırıcı, bu yüzden yararlı olması durumunda bunu daha çok "uygulamalı örnek" olarak gönderdim. Sıfır kontrolü düzeltildi. GetYöntemi kullanmak yalnızca birden fazla varsa ilkini döndürür, bu nedenle bu daha fazlasına bir örnektir. Faydalı bilgi, teşekkürler!
rogerdpack

Ayrıca bir dizeyi sıfır ile karşılaştırabileceğinizi sanmıyorum: devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang yani string! = "" Geçerlidir
James Milner

Örnek tam olsaydı, kodun derleneceğini sanmıyorum. Bunu boş bir dize karşılaştırmak olamaz Values.Get()döner ile nil. golang.org/pkg/net/url/#Values
Daniel Farrell

19

Aşağıda bir örnek verilmiştir:

value := r.FormValue("field")

daha fazla bilgi için. http paketi hakkında belgelerini buradan ziyaret edebilirsiniz . FormValuetemel olarak POST veya PUT değerlerini veya GET değerlerini, bulduğu ilk sırayla döndürür.


8

İşte basit, çalışan bir örnek:

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

görüntü açıklamasını buraya girin



5

Aşağıdaki kelimeler resmi belgeden alınmıştır.

Form, hem URL alanının sorgu parametreleri hem de POST veya PUT form verileri dahil olmak üzere ayrıştırılmış form verilerini içerir . Bu alan yalnızca ParseForm çağrıldıktan sonra kullanılabilir.

Bu nedenle, aşağıdaki gibi örnek kodlar işe yarar.

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.