Як в http-пакеті Go, як отримати рядок запиту на запит POST?


114

Я використовую httpпакет від Go для вирішення запиту POST. Як я можу отримати доступ і проаналізувати вміст рядка запиту від Requestоб'єкта? Я не можу знайти відповідь з офіційної документації.


Одне, що потрібно пам’ятати, якщо ви використовуєте cURL для надсилання запитів, а ви використовуєте r.FormValue("id")для отримання парам-запиту, ви не можете надсилати i через дані форми в cURL (тобто curl 0.0.0.0:8888 -d id=foobarне працюватимуть). Ви повинні надіслати його через параметри запитів ( curl 0.0.0.0:8888?id=foobar).

Відповіді:


145

QueryString є, за визначенням , у URL-адресі. Ви можете отримати доступ до URL-адреси запиту, використовуючи req.URL( doc ). Об'єкт URL має Query()метод ( doc ), який повертає Valuesтип, який є просто map[string][]stringпараметром QueryString.

Якщо ви шукаєте дані POST , подані у формі HTML , то це (як правило) пара ключових значень в тілі запиту. Ви правильно сказали, що можете зателефонувати, ParseForm()а потім використати req.Formполе, щоб отримати карту пар ключових значень, але ви також можете зателефонувати, FormValue(key)щоб отримати значення конкретного ключа. Це вимагає дзвінка, ParseForm()якщо потрібно, і отримує значення незалежно від того, як вони були надіслані (тобто в рядку запиту або в тілі запиту).


2
Дякую за вказівки.
Фабієн

2
Я знаходжу метод 'req.FormValue (ключ)' більш швидким і зроблю для вас весь необхідний код для попереднього розбору URL-адреси.
ТількиАнгель

6
req.URL.RawQueryповертає все після ?запиту GET, якщо це допомагає.
Кутон

Мені здалося цікавим req.Form - це порожній масив, якщо один раз не викликається req.formValue ("some_field") в оренді.
Qian Chen

Дякую тонну! @kouton
Aditya Varma

127

Ось більш конкретний приклад доступу до параметрів GET. RequestОб'єкт має метод , який аналізує їх для вас називається Query :

Якщо припустити 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=&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
  }    
}

Також зауважте, що "ключі на карті значень [тобто значення повернення запиту ()] залежать від регістру".


4
Попередній відповідь вже згадувалося і в зв'язку з Документами ведення тільки що (і це не приклад , який буде панікувати з поза меж порізати посилання , якщо шукане поле немає, використання , r.URL.Query().Get("moviename")щоб уникнути цієї фатальної помилки).
Дейв C

1
Дякуємо за інформацію. Так, документи трохи заплутані для мене, тому я опублікував це як більше "руки на прикладі" на випадок корисного. Виправлено нульовий чек. Використання Getметоду повертає перше, лише якщо їх декілька, тому це приклад більше. Корисна інформація, дякую!
rogerdpack

Також я не думаю, що ви можете порівнювати рядок з нулем: devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang, тобто string! = "" Дійсно
Джеймс Мілнер

Я не думаю, що цей код складеться, якби приклад був завершеним. Ви не можете порівняти порожній рядок, який Values.Get()повертається nil. golang.org/pkg/net/url/#Values
Даніель Фаррелл

19

Нижче наведено приклад:

value := r.FormValue("field")

для отримання додаткової інформації. про пакунок http, ви можете відвідати його документацію тут . FormValueв основному повертає значення POST або PUT, або GET, у тому порядку, перший, який він знайде.


8

Ось простий, робочий приклад:

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

введіть тут опис зображення


6

Існує два способи отримання параметрів запитів:

  1. Використання reqeust.URL.Query ()
  2. Використання запиту. Форма

У другому випадку потрібно бути обережним, оскільки параметри тіла матимуть перевагу над параметрами запиту. Повний опис отримання параметрів запитів можна знайти тут

https://golangbyexample.com/net-http-package-get-query-params-golang


5

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

Форма містить проаналізовані дані форми, включаючи як параметри запиту поля URL, так і дані форми POST або 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.