Процесс добавления данных разбивается на две части. Вначале нам надо показать пользователю форму для ввода данных. Затем, когда пользователь отправит введенные данные, нам надо их получить и добавить в базу данных.
Возьмем проект из прошлой темы. И прежде всего добавим в папку templates новый файл create.html, который будет содержать форму для добавления:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>New Product</title> </head> <body> <h3>Add Product</h3> <form method="POST"> <label>Model</label><br> <input type="text" name="model" /><br><br> <label>Company</label><br> <input type="text" name="company" /><br><br> <label>Price</label><br> <input type="number" name="price" /><br><br> <input type="submit" value="Send" /> </form> </body> </html>
Изменим файл сервера следующим образом:
package main import ( "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" "net/http" "html/template" "log" ) type Product struct{ Id int Model string Company string Price int } var database *sql.DB // функция добавления данных func CreateHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { err := r.ParseForm() if err != nil { log.Println(err) } model := r.FormValue("model") company := r.FormValue("company") price := r.FormValue("price") _, err = database.Exec("insert into productdb.Products (model, company, price) values (?, ?, ?)", model, company, price) if err != nil { log.Println(err) } http.Redirect(w, r, "/", 301) }else{ http.ServeFile(w,r, "templates/create.html") } } func IndexHandler(w http.ResponseWriter, r *http.Request) { rows, err := database.Query("select * from productdb.Products") if err != nil { log.Println(err) } defer rows.Close() products := []Product{} for rows.Next(){ p := Product{} err := rows.Scan(&p.Id, &p.Model, &p.Company, &p.Price) if err != nil{ fmt.Println(err) continue } products = append(products, p) } tmpl, _ := template.ParseFiles("templates/index.html") tmpl.Execute(w, products) } func main() { db, err := sql.Open("mysql", "root:password@/productdb") if err != nil { log.Println(err) } database = db defer db.Close() http.HandleFunc("/", IndexHandler) http.HandleFunc("/create", CreateHandler) fmt.Println("Server is listening...") http.ListenAndServe(":8181", nil) }
Для добавления данных определена функция CreateHandler()
. Поскольку нам надо, с одной стороны, отображать пользователю форму для добавления,
а, с другой стороны, получать и добавлять данные в БД, то данная функция условно разделена на две части. В ней мы проверяем тип запроса. Если запрос представляет тип
"GET", то мы будем возвращать форму для добавления. Если запрос имеет тип "POST", то парсим данные полученной формы и извлекаем из них нужные элементы.
Для извлечения нужных данных из полученных форм применяется метод r.FormValue()
. В качестве параметра этому методу передается название данных. То есть, например, на форме есть
следующее поле:
<input type="text" name="model" />
Атрибут name указывает, что название этого поля - "model". Следовательно, чтобы получить введенные в него данные, необходимо использовать выражение
model := r.FormValue("model")
.
После получения всех данных они добавляются в БД с помощью метода database.Exec:
database.Exec("insert into productdb.Products (model, company, price) values (?, ?, ?)", model, company, price)
После этого выполняется переадресация на корень сайта с помощью функции http.Redirect:
http.Redirect(w, r, "/", 301)
Третий параметр указывает путь переадресации. В данном случае "/", по которому выводится список объектов из БД. Четвертый параметр представляет статусный код переадресации. В данном случае код 301 указывает, что переадресация временная.
Если же запрос к серверу представляет тип GET, то просто возвращаем пользователю веб-страницу create.html:
http.ServeFile(w,r, "templates/create.html")
Функция IndexHandler, которая возвращает список объектов, остается той же, что и в прошлой теме.
Ну и в функции main CreateHandler устанавливаеncя в качестве обработчика по пути "/create":
http.HandleFunc("/create", CreateHandler)
Запустим приложение. Перейдем по пути "http://localhost:8181/create", и нам отобразится форма. Введем в нее какие-нибудь данные:
И после отправки формы приложение получит данные, добавит их в БД и переадресует на главную страницу: