Параметры адреса запроса в Go
Параметры после знака вопроса не входят в путь маршрута: их читают из разобранного адреса запроса. Карта значений дает строку по имени ключа; отсутствующий ключ дает пустую строку, а не ошибку.
Имя и значение в адресе разделяют знаком равенства, пары перечисляют через амперсанд. Клиент из раздела про HTTP уже собирал такие хвосты; здесь сервер только читает готовый запрос.
Вернем значение параметра q текстом:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /search", func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query().Get("q")
fmt.Fprintf(w, "q=%s", q)
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
При адресе /search?q=go в ответе
q=go. Без параметра q
получится q=.
Два имени читают отдельными вызовами:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /page", func(w http.ResponseWriter, r *http.Request) {
lang := r.URL.Query().Get("lang")
theme := r.URL.Query().Get("theme")
fmt.Fprintf(w, "%s/%s", lang, theme)
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
Дан путь /hello и параметр name.
Напишите полный main.go, который
при /hello?name=ann вернет текст
ann.
Дан следующий код:
limit := r.URL.Query().Get("limit")
fmt.Fprint(w, len(limit))
Скажите, что напечатается в ответе, если
параметра limit в адресе нет.
Дан адрес /search?q=go&q=sql.
Скажите, что вернет Get("q")
для первого значения ключа.