Строка запроса представляет набор параметров, которые помещаются в адресе после вопросительного знака. При этом каждый параметр определяет название и значение. Например, в адресе:
localhost:8181/user?name=Sam&age=21
Часть ?name=Sam&age=21
представляет строку запроса, в которой есть два параметра name и age. Для каждого параметра определено имя и значение,
которые отделяются знаком равно. Параметр name имеет значение "Sam", а параметр age - значение 21. Друг от друга параметры отделяются знаком амперсанда.
Для получения строки запроса у объекта Request вначале надо получить запрошенный адрес через переменную URL
. Далее у адреса
вызывается метод Query()
, который и возвращает строку запроса.
Например, получим данные строки запроса:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request){ name := r.URL.Query().Get("name") age := r.URL.Query().Get("age") fmt.Fprintf(w, "Имя: %s Возраст: %s", name, age) }) fmt.Println("Server is listening...") http.ListenAndServe(":8181", nil) }
Чтобы получить значение отдельного параметра, применяется метод Get()
, в который передается имя параметра:
Рассмотрим, как мы можем получить в Go значения отправленных форм.
Все данные запроса в Go инкапсулируются в объекте http.Request. Через его метод FormValue() можно получить определенные данные, которые отправлены через форму.
func (r *Request) FormValue(key string) string
Метод FormValue() извлекает данные по ключу из запроса POST и PUT, а также из строки запроса. При этом он всегда возвращает строку.
Например, определим рядом с сервером файл user.html со следующим кодом:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ввод данных</title> </head> <body> <h2>Ввод данных</h2> <form method="POST" action="postform"> <label>Имя</label><br> <input type="text" name="username" /><br><br> <label>Возраст</label><br> <input type="number" name="userage" /><br><br> <input type="submit" value="Отправить" /> </form> </body> </html>
В данном случае на форме два поля - username и userage. При нажатии на кнопку данные будут отправляться запросом POST по адресу "/postform".
В коде сервера определим получение данных:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){ http.ServeFile(w, r, "user.html") }) http.HandleFunc("/postform", func(w http.ResponseWriter, r *http.Request){ name := r.FormValue("username") age := r.FormValue("userage") fmt.Fprintf(w, "Имя: %s Возраст: %s", name, age) }) fmt.Println("Server is listening...") http.ListenAndServe(":8181", nil) }
По запросу к корню сайта приложение будет отправлять пользователю файл user.html для ввода данных. При отправке форму на адрес "/postform"
приложение будет получать данные. Так как поля на форме называются username и userage, то чтобы получить эти данные, нужно использовать эти имена, типа
name := r.FormValue("username")
.
При этом также FormValue позволяет получить данные из строки запроса, то есть мы, например, можем передать значения для username и userage через строку запроса: