重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在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程序,打开服务地址不可用了,这个又是一个奇怪问题哈哈。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧