cpp

Веб-сервер на Go. Получение данных формы

Форму мы можем отправить методами GET и POST. При использовании метода GET данные передаются в составе URL-адреса после вопросительного знака: http://localhost:3000/form?x=5&c=%D0%B0. Получить эти данные позволяет метод Query() структуры URL. В качестве примера создадим в каталоге C:\book файл index.html и добавим в него код из листинга 20.5.

Листинг 20.5. Содержимое файла C:\book\index.html

<!doctype html>
<html lang="ru">
<head>
   <meta charset="utf-8">
   <title>Отправка данных методом GET</title>
</head>
<body>
 <form action="/form" method="GET">
  <div>
   Логин:<br>
   <input type="text" name="login"><br>
   Пароль:<br>
   <input type="password" name="passw"><br>
   <select name="theme">
     <option value="0" selected>Тема не выбрана</option>
     <option value="1">Тема1</option>
     <option value="2">Тема2</option>
     <option value="3">Тема3</option>
   </select><br>
   <input type="submit" value="Отправить">
  </div>
 </form>
</body>
</html>

Отобразим содержимое файла index.html при запросе http://localhost:3000/. Получим данные формы при передаче их по адресу http://localhost:3000/form (листинг 20.6).

Листинг 20.6. Получение данных формы (метод GET)

package main

import (
   "fmt"
   "net/http"
)

func main() {
   http.HandleFunc("/",
      func(rw http.ResponseWriter, r *http.Request) {
         rw.Header().Add("Server", "MyServer 1.0")
         // Выводим форму
         http.ServeFile(rw, r, `C:\book\index.html`)
      })
   http.HandleFunc("/form",
      func(rw http.ResponseWriter, r *http.Request) {
         rw.Header().Add("Server", "MyServer 1.0")
         // Обрабатываем данные формы
         login := r.URL.Query().Get("login")
         passw := r.URL.Query().Get("passw")
         theme := r.URL.Query().Get("theme")
         rw.Header().Add("Content-Type", "text/plain; charset=UTF-8")
         fmt.Fprintln(rw, "Логин:", login, "\nПароль:", passw,
                      "\nТема:", theme)
      })
   fmt.Println(http.ListenAndServe(":3000", nil))
}

Для получения данных формы методами GET и POST (имеет более высокий приоритет) можно воспользоваться методом FormValue() структуры Request. Формат метода:

(*http.Request).FormValue(key string) string

Переделаем код из листинга 20.6 и используем метод FormValue() (листинг 20.7).

Листинг 20.7. Метод FormValue()

package main

import (
   "fmt"
   "net/http"
)

func main() {
   http.HandleFunc("/",
      func(rw http.ResponseWriter, r *http.Request) {
         rw.Header().Add("Server", "MyServer 1.0")
         http.ServeFile(rw, r, `C:\book\index.html`)
      })
   http.HandleFunc("/form",
      func(rw http.ResponseWriter, r *http.Request) {
         rw.Header().Add("Server", "MyServer 1.0")
         // Обрабатываем данные формы
         login := r.FormValue("login")
         passw := r.FormValue("passw")
         theme := r.FormValue("theme")
         rw.Header().Add("Content-Type", "text/plain; charset=UTF-8")
         fmt.Fprintln(rw, "Логин:", login, "\nПароль:", passw,
                      "\nТема:", theme, "\nМетод:", r.Method)
      })
   fmt.Println(http.ListenAndServe(":3000", nil))
}

Метод FormValue() позволяет получить данные, отправленные как методом GET, так и методом POST. При этом метод POST имеет более высокий приоритет. Давайте изменим строку:

<form action="/form" method="GET">

в файле C:\book\index.html следующим образом:

<form action="/form" method="POST">

Теперь мы имеем возможность получать данные, отправленные методом POST.

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp