• Go语言解析表单form里提交的值以及错误处理


    在Web开发中,数据的获取很多时候都是通过提交表单来实现,比如提交个人资料到数据库等,是比较常见的一种交互方式,那在go语言里面怎么获取,通过http包来实现。
    http.Request里面的ParseForm()来解析表单

    Web开发很多年没有用到了,如果你也同样没有服务器环境的话,跟着我快速搭一个Apache的服务环境,先下载:
    https://www.apachelounge.com/download/
    httpd-2.4.54-win64-VS17.zip

    下载完之后,解压即可,来到配置文件目录,这个看你自己存放的地方,本人图个简单直接放下载目录了,如下:
    C:\Users\Tony\Downloads\httpd-2.4.54-win64-VS17\Apache24\conf

    httpd.conf
    修改成安装目录
    Define SRVROOT "C:\Users\Tony\Downloads\httpd-2.4.54-win64-VS17\Apache24"
    ServerRoot "${SRVROOT}"

    修改端口(避免80被占用,最好大点一般很少被占用,不超过65535即可)
    Listen 8011
    ServerName localhost:8011


    然后用管理员命令行来到bin目录:
    C:\Users\Tony\Downloads\httpd-2.4.54-win64-VS17\Apache24\bin>httpd -k install
    C:\Users\Tony\Downloads\httpd-2.4.54-win64-VS17\Apache24\bin>httpd -k start

    然后重启下
    C:\Users\Tony\Downloads\httpd-2.4.54-win64-VS17\Apache24\bin>httpd -k restart

    输入:http://localhost:8011/ 即可显示It works!这个页面就是htdocs里的index.html

    然后我们写一个go程序来获取其表单提交的内容

    test.go

    1. package main
    2. import (
    3. "fmt"
    4. "log"
    5. "net/http"
    6. )
    7. func GetForm(w http.ResponseWriter, r *http.Request) {
    8. r.ParseForm()
    9. for k, v := range r.Form {
    10. fmt.Printf("键:%s,值:%s,%T\n", k, v, v)
    11. }
    12. fmt.Fprintf(w, "寅恪光潜")
    13. }
    14. func main() {
    15. http.HandleFunc("/", GetForm)
    16. err := http.ListenAndServe("localhost:55555", nil)
    17. if err != nil {
    18. log.Fatal(err)
    19. }
    20. }

    go run test.go
    执行的时候发现报错:

    listen tcp 127.0.0.1:8011: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
    exit status 1

    为什么会被禁止访问呢,没权限?于是使用了一些方法,关掉防火墙,没用。

    netstat -ano | findstr "8011"
    查看端口是不是被其他程序使用

     TCP    0.0.0.0:8011           0.0.0.0:0              LISTENING       4028
     TCP    [::]:8011              [::]:0                 LISTENING       4028

    好像也不是,这个就是上面我们弄的Apache服务开的端口。
     那是什么原因呢?网上有两种答案,一个是Hyper-v的问题,于是关闭它
    dism.exe /online /disable-feature:microsoft-hyper-v
    一样报错
    还有一种就是将一些端口排除开来,避免被使用,于是将8011开始的10个端口号都排除,为连续的端口块添加排除
    netsh int ipv4 add excludedportrange protocol=tcp startport=8011 numberofports=10

          标记                 值
          protocol       - 为以下值之一:
                           tcp: 为 TCP 添加排除。
                           udp: 为 UDP 添加排除。
          startport      - 排除的起始端口号。
          numberofports  - 从排除的 startport 开始的
                           端口号。
          store          - 为以下值之一:
                           active: 设置只持续到下一次启动。
                           persistent: 更改持久有效。
                                       这是默认值。

    另一个程序正在使用此文件,进程无法访问。

    端口被使用了,这个时候我好像找到原因了,因为我换了端口,重启Apache之后再来排除端口,那这个端口只能是Apache开启端口被占用。
    思路对了之后,问题就好解决了:
    新开一个端口55555,然后先不要打开http://localhost:55555/这样的服务,不然端口被占用了。
    先执行go语言程序,这样就一直是监听状态,然后打开一个页面,提交表单

    1. <form action="http://localhost:55555/" method="post">
    2. <input type="text" name="NickName" />p>
    3. <input type="text" name="Age" />p>
    4. <input type="text" name="Hobby" />p>
    5. <input type="submit" value="Submit" />
    6. form>

    get提交的话,也就是一个这样的网址
    http://localhost:55555/?NickName=Tony&Age=28&Hobby=Reading
    这个时候我们就可以发现go程序获取到了表单的数据了,Age修改成28,又接收到一次值:

    C:\Users\Tony>go run test.go
    键:Hobby,值:[Reading],[]string
    键:NickName,值:[Tony],[]string
    键:Age,值:[18],[]string
    键:NickName,值:[Tony],[]string
    键:Age,值:[28],[]string
    键:Hobby,值:[Reading],[]string

    当然了,post提交同样可以获取,大家可以试下。

    不过又出来一个新问题,发现没有执行go程序,打开服务地址不可用了,这个又是一个奇怪问题哈哈。

  • 相关阅读:
    java强引用,软引用,弱引用,虚引用,终结器引用
    Codeforces Round #804 (Div. 2) 题解(简)
    简单阐述函数
    自学的一些面试题-html
    前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)
    mysql中的update的常用sql
    【LeetCode】剑指 Offer Ⅱ 第6章:栈(6道题) -- Java Version
    Elasticsearch(macbook搭建,Elasticsearch+kibana)一步到位
    Scala入门到放弃—03—面向对象
    服务器产生丢包的原因有哪些
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/128151423