04.1
This commit is contained in:
31
ru/04.1.md
31
ru/04.1.md
@@ -15,7 +15,7 @@
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Эта форма отправит данные по адресу `/login` на сервер. После того, как пользователь нажем кнопку "Войти", дата будет послана на хэндлер `login`, зарегистрированный маршрутизатором сервера. Нам нужно знать, какой метод используется при этом - POST или GET?
|
||||
Эта форма отправит данные по адресу `/login` на сервер. После того, как пользователь нажем кнопку "Войти", данные будут посланы на хэндлер `login`, зарегистрированный маршрутизатором сервера. Нам нужно знать, какой метод используется при этом - POST или GET?
|
||||
|
||||
Это легко узнать при помощи пакета `http`. Давайте посмотрим, как обработать данные формы со страницы входа:
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
)
|
||||
|
||||
func sayhelloName(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm() //Анализирует переданные параметры url, затем анализирует пакет ответа для тела POST (тела запроса)
|
||||
// внимание: без вызова метода ParseForm послежующие данные не будут получены
|
||||
fmt.Println(r.Form) // печатает информацию на сервере.
|
||||
r.ParseForm() // Анализирует переданные параметры url, затем анализирует пакет ответа для тела POST (тела запроса)
|
||||
// внимание: без вызова метода ParseForm последующие данные не будут получены
|
||||
fmt.Println(r.Form) // печатает информацию на сервере
|
||||
fmt.Println("Путь: ", r.URL.Path)
|
||||
fmt.Println("Схема: ", r.URL.Scheme)
|
||||
fmt.Println(r.Form["url_long"])
|
||||
@@ -44,7 +44,7 @@
|
||||
}
|
||||
|
||||
func login(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("Метод:", r.Method) //получаем информацию о методе запроса
|
||||
fmt.Println("Метод:", r.Method) // получаем информацию о методе запроса
|
||||
if r.Method == "GET" {
|
||||
t, _ := template.ParseFiles("login.gtpl")
|
||||
t.Execute(w, nil)
|
||||
@@ -68,9 +68,9 @@
|
||||
|
||||
Здесь мы используем `r.Method` для того, чтобы получить информацию о методе запроса, и нам возвращается метод HTTP -"GET", "POST", "PUT" и т.д.
|
||||
|
||||
В функции `login` мы использовали метод `r.Method`, чтобы проверить, это страница входа или логика обработки информации о входе. Другими словами, мы проверяем, открыл ли пользователь страницу или уже пытается войти. Сервер отображает страницу только в случае, если запрос идет посредством метода GET, и запускает логику обработки информации о входе, если запрос использует метод POST.
|
||||
В функции `login` мы использовали метод `r.Method`, чтобы проверить, что это - страница входа или логика обработки информации о входе. Другими словами, мы проверяем, открыл ли пользователь страницу или уже заполнил форму и пытается войти. Сервер отображает страницу только в случае, если запрос идет посредством метода GET, и запускает логику обработки информации о входе, если запрос использует метод POST.
|
||||
|
||||
Вы должны увидеть следующий интерфейс после открытия `http://127.0.0.1:9090/login` в броузере:
|
||||
Вы должны увидеть следующий интерфейс после открытия `http://127.0.0.1:9090/login` в браузере:
|
||||
|
||||

|
||||
|
||||
@@ -78,16 +78,15 @@
|
||||
|
||||
Сервер ничего не напечатает, пока мы не введем имя пользователя и пароль, потому что хэндлер не будет анализировать данные, пока мы не вызовем `r.ParseForm()`. Давайте добавим `r.ParseForm()` перед `fmt.Println("username:", r.Form["username"])`, скомпилируем программу и вновь протестируем её. Вы обнаружите, что в этом случае информация стала печататься на стороне сервера.
|
||||
|
||||
`r.Form` contains all of the request arguments, for instance the query-string in the URL and the data in POST and PUT. If the data has conflicts, for example parameters that have the same name, the server will save the data into a slice with multiple values. The Go documentation states that Go will save the data from GET and POST requests in different places.
|
||||
`r.Form` содержит все аргументы запроса, например, сторку запроса в URL и данные в POST и PUT. Если в данных есть конфликты, например, параметры имеют одинаковое имя, сервер сохранит данные в срез из множества значений. Документация Go говорит о том, что Go сохраняет данные из запросов GET и POST в разных местах.
|
||||
|
||||
Try changing the value of the action in the form `http://127.0.0.1:9090/login` to `http://127.0.0.1:9090/login?username=astaxie` in the `login.gtpl` file, test it again, and you will see that the slice is printed on the server side.
|
||||
Попробуйте изменить значение поля 'action' в форме `http://127.0.0.1:9090/login` на `http://127.0.0.1:9090/login?username=astaxie` в файле `login.gtpl`, протестируйте работу формы, и Вы увидите, что на стороне сервера вывелся срез значений.
|
||||
|
||||

|
||||
|
||||
Figure 4.2 Server prints request data
|
||||
Рисунок 4.2 Сервер печатает данные запроса
|
||||
|
||||
The type of `request.Form` is `url.Value`. It saves data with the format `key=value`.
|
||||
Тип поля `request.Form` - это `url.Value`. Данные в нем сохраняются в формате `ключ=значение`.
|
||||
|
||||
v := url.Values{}
|
||||
v.Set("name", "Ava")
|
||||
@@ -99,10 +98,10 @@ The type of `request.Form` is `url.Value`. It saves data with the format `key=va
|
||||
fmt.Println(v.Get("friend"))
|
||||
fmt.Println(v["friend"])
|
||||
|
||||
**Tips** Requests have the ability to access form data using the `FormValue()` method. For example, you can change `r.Form["username"]` to `r.FormValue("username")`, and Go calls `r.ParseForm` automatically. Notice that it returns the first value if there are arguments with the same name, and it returns an empty string if there is no such argument.
|
||||
**Совет** Запросы могут получать доступ к данным формы с использованием метода `FormValue()`. Например, можно вместо `r.Form["username"]` использовать `r.FormValue("username")`, и Go вызовет `r.ParseForm` автоматически. Отметим, что в случае наличия нескольких аргументов с одним и тем же именем этот метод вернет первое из значений, а в случае отсутствия такого аргумента вернет пустую строку.
|
||||
|
||||
## Links
|
||||
## Ссылки
|
||||
|
||||
- [Directory](preface.md)
|
||||
- Previous section: [User form](04.0.md)
|
||||
- Next section: [Verification of inputs](04.2.md)
|
||||
- [Содержание](preface.md)
|
||||
- Предыдущий раздел: [Пользовательские формы](04.0.md)
|
||||
- Следующий раздел: [Проверка введенных данных](04.2.md)
|
||||
|
||||
Reference in New Issue
Block a user