Go基础学习记录 - 编写Web应用程序 - Web开发表单处理

{app.params.name}}{app.params.name}}{app.params.name}}

前面的文章分享的部分功能都能正常使用,本次分享分析下里面的细节部分 -- 表单处理

为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,没办法学会。

项目地址

https://github.com/durban89/wiki_blog
tag: 1.0.0

有些同学可能看不懂,怎么就只给了这些,完全不懂呀。我把使用的命令打出来,照着操作,就应该可以解决了

git clone https://github.com/durban89/wiki_blog /local/path
cd /local/path
git fetch origin
git checkout 1.0.0

这些我觉得 够清晰了。OK!继续我们的表单处理逻辑。这里我一个templates/edit.html为例

<form action="/save/{{.Title}}" method="POST">
  <div class="form-group">
    <textarea class="form-control" name="body" rows="20" cols="80">{{printf "%s" .Body}}</textarea>
  </div>

  <button type="submit" class="btn btn-primary">Submit</button>
</form>


此表单将提交到服务器上的/save/{{.Title}}。
用户单击Submit按钮后,数据将被发送到服务器路由器注册的save处理程序。
然后我们需要知道它是使用POST方法还是GET。这里很明显是POST
使用http包很容易找到。
让我们看看save页面上的表单数据处理
打开文件controllers/article.go 找到ArticleSave方法。这个方法是处理save请求的,找到

body := r.FormValue("body")

这里只接收了一个body参数,如果有其他参数的话,获取方式是一样的,这里为了测试我们修改下form表单的代码添加一个作者信息,如下

<form action="/save/{{.Title}}" method="POST">
  <div class="form-group">
    <label for="author">作者</label>
    <input class="form-control" name="author" id="author" value=""/>
  </div>
  <div class="form-group">
    <label for="body">文章内容</label>
    <textarea class="form-control" name="body" id="body" rows="20" cols="80">{{printf "%s" .Body}}</textarea>
  </div>

  <button type="submit" class="btn btn-primary">Submit</button>
</form>

还要修改下ArticleSave函数,如下

func ArticleSave(w http.ResponseWriter, r *http.Request, title string) {
    body := r.FormValue("body")
    author := r.FormValue("author")
    method := r.Method

    fmt.Println("author ", author)
    fmt.Println("method: ", method)

    p := &helpers.Page{
        Title: title,
        Body:  []byte(body),
    }

    err := p.Save()

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

主要是加了如下部分内容

author := r.FormValue("author")
method := r.Method

fmt.Println("author ", author)
fmt.Println("method: ", method)

这里多加了一个method的输出,为了后续逻辑做铺垫。比如如果是get请求的话,我们就不做处理,或者返回一个错误信息

重新编译项目并启动,请求save/后在终端会看到如下输出

author  作者名称
method:  POST

这里的例子我使用的是FormValue,还有另外一个组合也可以使用,如下

r.ParseForm()
r.Form["author"]

这种方式获取到的值是一个数组,打印出来的话类似如下

[作者名称]

当使用r.FormValue的时候会自动执行r.ParseForm(),并且r.FormValue的获取的只是其中一个值,如果我们提交过来的数据是一个数组的话,只用r.FormValue的话会有问题request.Form的类型是url.Value。
它使用格式key = value保存数据,如下演示

v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")

fmt.Println(v.Encode()) // == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
fmt.Println(v.Get("name"))
fmt.Println(v.Get("friend"))
fmt.Println(v["friend"])

好了,关于表单的分享暂时就这些

项目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.1

 

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/52


版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/52