猿问

如何在 Golang 中将 html 数据移动到结构体

我是 Golang 的新手,我正在尝试将数据从操作字段移动到结构。


我的主要功能是:


func main () {

    http.HandleFunc("/public/", func (w http.ResponseWriter, r *http.Request) {

        http.ServeFile(w, r, r.URL.Path[1:]) })

    http.HandleFunc("/public/new_user/", signup) 

    http.ListenAndServe(":8080", nil)

}



// struct for recieving Signup data input from signup.html

type Signup struct {

    name  string

    email string

}


// func to receive data into struc above FROM signup.html

func signup(w http.ResponseWriter, r *http.Request) {

    var S Signup 


    S.name = r.FormValue("name")

    S.email = r.FormValue("email")


    //this is just to test the output

    fmt.Println("%v\n", S.name)

    fmt.Println("%v\n", S.email)

}

我有http.HandleFunc("public/new_user/", signup)哪个应该呈现signup函数。但是,当我路由到public/new_user而不是从 func 注册接收结构时,我收到了一个空白的 html 页面。


上面的S.name = r.FormValue("name")和S.email = r.FormValue("email")行是从注册页面获取他们的信息,即:


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Sign Up</title>

</head>


<body>


<h1>Sign Up</h1>

<br/>


<form action="/public/new_user" method="post" id="form1">


<label>Name:</label>

<input type="string" name="name" />

</br>

</br>

<label>Email:</label>

<input type="string" name="email" />

</form>


</br>


<button type="submit" form="form1" value="Submit">Submit</button>


</body>


<!-- Latest compiled and minified CSS -->

<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">


<!-- jQuery library -->

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>


<!-- Latest compiled JavaScript -->

<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>


</html>

如您所见,此页面public/new_user在提交时路由到。任何人都可以告诉我为什么public/new_user看到我的情况是空白的public/new_user:


http.HandleFunc("/public/new_user/", signup) 

哪个应该呈现注册功能?谢谢


慕莱坞森
浏览 257回答 2
2回答

拉莫斯之舞

第一个问题是您为模式注册了处理程序,"/public/new_user/"但将表单发布到/public/new_user.您必须更改 HTML<form>才能使用此 URL:<form action="/public/new_user/" method="post" id="form1">这样做的重要性在于,即使访问 URL/public/new_user有效,因为发生了自动重定向(301 Moved permanently响应),但是当您的浏览器向新 URL(以斜杠结尾)发出第二次请求时,提交的表单不会被“携带”。执行此操作后,您仍然会收到一个空白页面,因为您的signup()函数不会写入任何响应(尽管您现在将在控制台上看到提交和打印的表单数据)。如果你想看到回复,要么写点什么,要么重定向到另一个页面。另请注意,fmt.Println()它没有格式字符串参数,它只打印您传递给它的所有内容。使用fmt.Printf(),如果你想使用的格式字符串。您也可以使用%+v格式字符串打印带有字段名称的完整结构。例如:func signup(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; var S Signup&nbsp; &nbsp; S.name = r.FormValue("name")&nbsp; &nbsp; S.email = r.FormValue("email")&nbsp; &nbsp; fmt.Printf("%+v\n", S)&nbsp; &nbsp; fmt.Fprintf(w, "Form received, you used name: %s", S.name)}

萧十郎

我认为您正在跳过表单验证。您必须检查客户端输入,并且应该放置令牌参数以防止 Xsrf 攻击。您可以使用此包来验证用户的输入。
随时随地看视频慕课网APP

相关分类

Go
我要回答