#http #go #redirect
#http #Вперед #перенаправление
Вопрос:
Я пытаюсь добавить идентификатор (и другую информацию) к URL-адресу, чтобы я мог получить к нему доступ позже, но я не могу найти правильный метод после некоторых исследований.
Я пытался использовать метод Get(), query(), Add(), но я не мог перенаправить URL.
var email_ployer string
func RegisterNewPloyer(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/ployer/register" {
http.Error(w, "404 not found.", http.StatusNotFound)
return
}
db := connect.ConnectDB()
defer db.Close()
switch r.Method {
case "POST":
email_ployer = r.FormValue("email")
senha := r.FormValue("senha")
senha, _ = HashPassword(senha)
tx, _ := db.Begin()
stmt, _ := tx.Prepare("INSERT INTO ployers(email_ployer, senha_ployer) VALUES(?,?)")
_, erro := stmt.Exec(email_ployer, senha)
if erro != nil {
tx.Rollback()
log.Fatal(erro)
}
tx.Commit()
}
Redirect(w, r)
}
func Redirect(w http.ResponseWriter, r *http.Request) {
db2 := connect.ConnectDB()
defer db2.Close()
var id string
tx, _ := db2.Begin()
rows, _ := tx.Query("SELECT id FROM ployers WHERE email_ployer = '?'", email_ployer)
for rows.Next() {
if err := rows.Scan(amp;id); err != nil {
log.Fatal(err)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
http.Redirect(w, r, x, http.StatusSeeOther)
}
func main() {
http.HandleFunc("/ployer/seja-um-de-nos", LoadPloyerContent)
http.HandleFunc("/ployer/register", register.RegisterNewPloyer)
http.HandleFunc("/ployer/complete/", LoadPloyerContent)
http.HandleFunc("/ployer/register-received", LoadPloyerContent)
log.Fatal(http.ListenAndServe(":3306", nil))
}
В моей системе я хочу, чтобы пользователь зарегистрировал свой E-mail и пароль, создал нового пользователя в БД и перенаправил URL-адрес на что-то вроде localhost:3306/ ployer/complete/id
Комментарии:
1. Обратите внимание, что вы замалчиваете множество ошибок в этом коде (например,
rows, _ := tx.Query(..)
, что почти наверняка не очень хорошая идея. Что, если у вас есть опечатка в SQL-запросе или параметре? Или что, если произойдет что-то неожиданное (база данных ушла)? Вы всегда должны проверять ошибки! Кроме того,email_ployer = '?'
выглядит неправильно? Вам не нужны кавычки там, так как вы используете параметризованные запросы. Не уверен, связан ли он с вашей проблемой.
Ответ №1:
Просто используйте res.LastInsertId()
, чтобы получить идентификатор и передать его вашей функции перенаправления, и создайте URL:
func RegisterNewPloyer(w http.ResponseWriter, r *http.Request) {
//...
//...
res, erro := stmt.Exec(email_ployer, senha)
if erro != nil {
tx.Rollback()
log.Fatal(erro)
}
tx.Commit()
id, erro := res.LastInsertId()
if erro != nil {
log.Fatal(erro)
}
Redirect(w, r, id)
}
func Redirect(w http.ResponseWriter, r *http.Request, id int64) {
uri := fmt.Sprintf("http://localhost:3306/ployer/complete/%d", id)
http.Redirect(w, r, uri, http.StatusSeeOther)
}
Ответ №2:
Вы должны использовать url.Values
для построения карты значений строки запроса. Позже вы можете использовать Encode
метод для генерации закодированной строки запроса. Присвойте это значение Url.RawQuery
, чтобы получить окончательный результат.
например:
base, _ := url.Parse("https://www.foo.com/")
// Create an instance of Values to hold your query string parameters
values := url.Values{}
values.Add("abc", "def")
// Set the encoded output to RawQuery attribute of Url
base.RawQuery = values.Encode()
println(base.String())
Если вы начинаете с URL-адреса, в котором уже есть параметры строки запроса, и вы хотите добавить / изменить в нем элементы, используйте Query()
метод для получения ссылки на проанализированную карту.
например:
base, _ := url.Parse("https://www.foo.com/?a=b")
values := base.Query()
values.Set("a", "c")
values.Set("x", "y")
// Set the encoded output to RawQuery attribute of Url
base.RawQuery = values.Encode()
println(base.String())