В http-пакете Go, как мне получить строку запроса на запрос POST?


Я использую httpпакет от перехода к работе с запросом POST. Как я могу получить доступ и проанализировать содержимое строки запроса из

5 69

5 ответов:

строка запроса,по определению, в URL. Вы можете получить доступ к URL запроса с помощью req.URL (doc). URL-адрес объекта имеет Query() метод (doc), которая возвращает Values тип, который является просто map[string][]string параметры строки запроса.

если то, что вы ищете, это данные POST как представлено в HTML-форме, то это (обычно) пара ключ-значение в теле запроса. Вы правы в своем ответьте, что вы можете позвонить ParseForm() и затем использовать req.Form поле для получения карты пар ключ-значение, но вы также можете позвонить FormValue(key) чтобы получить значение определенного ключа. Это вызывает ParseForm() если требуется, и получает значения независимо от того, как они были отправлены (т. е. в строке запроса или в теле запроса).

вот более конкретный пример того, как получить доступ к параметрам GET. Элемент Request объект имеет метод, который анализирует их для вас называется запрос:

предполагая, что URL-адрес запроса, как http://host:port/something?параметр1=б

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 param1s != nil {
    // ... process them ... or you could just iterate over them without a nil check
    // [if none were present, will be a nil array, which golang treats as an empty array]
    // 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 ()] чувствительны к регистру."

пример:

value := FormValue("field")

для получения дополнительной информации. о пакете http, вы можете посетить его документацию здесь. FormValue в основном возвращает POST или PUT значения, или получить значения, в этом порядке, Первый, который он находит.

вот простой пример:

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

enter image description here

Ниже приводятся слова из официального документа.

форма содержит проанализированные данные формы, включая оба параметры запроса поля URL и разместить или поместить данные формы. Это поле доступно только после вызова 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
}