通常,在制作Web应用程序时,我会使用JSON API和SPA,但是我正在尝试学习如何在Go中使用更简单的服务器端模板处理方法和默认表单行为。
目前,我正在执行与here类似的操作。唯一的不同是,为了简单起见,我将action
更改为"/"
的形式,并从同一处理程序处理GET和POST(按方法类型过滤)。
服务器端模板
<form action="/" method="post" >
...
<div class="form-group">
<label for="myname">Dev Name</label>
<input type="text" class="form-control" id="myname" name="myname" value="{{.MyDname}}">
</div>
<button type="submit" class="btn btn-primary">Update</button>
</form>
服务器端
func MainPage(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //get request method
if r.Method == "GET" {
t, err := template.New("RTL Page").Parse(page)
if err != nil {
log.Fatal(err)
}
err = t.Execute(w, State)
if err != nil {
log.Fatal(err)
}
}
if r.Method == http.MethodPost {
r.ParseForm()
...
}
}
初始网页呈现得很好,数据可以在POST中正确发送,我只用200回答POST,但随后我的网页变成空白。
我如何告诉浏览器保留或重新呈现原始页面?我是否需要向POST发送HTML响应? 200以外的东西?
您要问的是HTTP的基本操作。客户端发送一个请求,服务器响应该请求。如果客户端是浏览器,则浏览器将显示响应。
对于GET请求,浏览器将GET请求发送到服务器,服务器以HTML页面响应,然后浏览器显示它。
对于POST请求,浏览器将发送POST请求以及表单中提交的值,并且服务器应以HTML页面进行响应,以便浏览器可以支付它。显示的响应将是POST响应,因此,如果您重新加载该页面,它将尝试重新提交表单。
@@ Volker指出了需要更改的地方。 POST需要由我想显示的HTML回答,因此解决此问题的真正简单方法是:
func MainPage(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //get request method
if r.Method == http.MethodPost {
r.ParseForm()
...
}
if r.Method == "GET" || r.Method == "POST" {
t, err := template.New("RTL Page").Parse(page)
if err != nil {
log.Fatal(err)
}
err = t.Execute(w, State)
if err != nil {
log.Fatal(err)
}
}
}