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

package main

import (
	"fmt"
	"log"
	"net/http"
)

func GetForm(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	for k, v := range r.Form {
		fmt.Printf("键:%s,值:%s,%T\n", k, v, v)
	}
	fmt.Fprintf(w, "寅恪光潜")
}
func main() {
	http.HandleFunc("/", GetForm)
	err := http.ListenAndServe("localhost:55555", nil)
	if err != nil {
		log.Fatal(err)
	}
}

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语言程序,这样就一直是监听状态,然后打开一个页面,提交表单

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程序,打开服务地址不可用了,这个又是一个奇怪问题哈哈。

你可能感兴趣的:(Golang,ParseForm,http.Request,ResponseWriter,HandleFunc,ListenAndServe)