• golang web开发获取get、post、cookie参数


    在成熟的语言java、python、php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下。

    golang版本:1.3.1
    在贴代码之前如果能先理解一下golang http.request的三个属性Form、PostForm、MultipartForm应该能较好的理解代码,下面摘录一下。

    Form、PostForm、MultipartForm说明
    Form、PostForm、MultipartForm说明

    简要说明一下

    Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法。
    PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法。
    MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法。
    获取GET参数

    网上比较常见的一个版本是:
    r.ParseForm()
    if len(r.Form["id"]) > 0 {
    fmt.Fprintln(w, r.Form["id"][0])
    }
    其中r表示*http.Request类型,w表示http.ResponseWriter类型。

    r.Form是url.Values字典类型,r.Form["id"]取到的是一个数组类型。因为http.request在解析参数的时候会将同名的参数都放进同一个数组里,所以这里要用[0]获取到第一个。

    这种取法在通常情况下都没有问题,但是如果是如下请求则无法取到需要的值:
    <form action="http://localhost:9090/?id=1" method="POST">
    <input type="text" name="id" value="2" />
    <input type="submit" value="submit" />
    </form>
    因为r.Form包含了get和post参数,并且以post参数为先,上例post参数和get参数都有id,所以应当会取到post参数2。虽然这种情况并不多见,但是从严谨的角度来看程序上还是应当处理这种情况。立马补上改进代码:
    queryForm, err := url.ParseQuery(r.URL.RawQuery)
    if err == nil && len(queryForm["id"]) > 0 {
      fmt.Fprintln(w, queryForm["id"][0])
    }
    代码比较简单,就是分析url问号后的参数。事实上这个也是标准库ParseForm中关于get参数解析代码。

    获取POST参数

    这里要分两种情况:

    普通的post表单请求,Content-Type=application/x-www-form-urlencoded
    有文件上传的表单,Content-Type=multipart/form-data
    第一种情况比较简单,直接用PostFormValue就可以取到了。

    fmt.Fprintln(w, r.PostFormValue("id"))
    第二种情况复杂一些,如下表单:
    <form action="http://localhost:9090" method="POST" enctype="multipart/form-data">
    <input type="text" name="id" value="2" />
    <input type="file" name="pic" />
    <input type="submit" value="submit" />
    </form>
    因为需要上传文件,所以表单enctype要设置成multipart/form-data。此时无法通过PostFormValue来获取id的值,因为golang库里还未实现这个方法:

    golang中不能用PostForm获取post参数
    golang中不能用PostForm获取post参数

    幸好golang中可以提供了另外一个属性MultipartForm来处理这种情况。
    r.ParseMultipartForm(32 << 20)
    if r.MultipartForm != nil {
      values := r.MultipartForm.Value["id"]
      if len(values) > 0 {
      fmt.Fprintln(w, values[0])
      }
    }

    获取COOKIE参数
    cookie, err := r.Cookie("id")
    if err == nil {
      fmt.Fprintln(w, "Domain:", cookie.Domain)
      fmt.Fprintln(w, "Expires:", cookie.Expires)
      fmt.Fprintln(w, "Name:", cookie.Name)
      fmt.Fprintln(w, "Value:", cookie.Value)
    }
    r.Cookie返回*http.Cookie类型,可以获取到domain、过期时间、值等数据。

  • 相关阅读:
    《TD项目开发小结》
    感悟
    毕业两年了
    ip+port无法访问nginx问题
    问题解决之道
    调休9天的那些日子
    关于类加载器(ClassLoader)
    ios核心蓝牙之心率监控(swift)
    git(git-flow)的高效管理使用
    WKWebview加载本地图片时出现路径问题
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8295626.html
Copyright © 2020-2023  润新知