我是一名 PHP 开发人员。但目前正在转向 Golang ......我正在尝试从表单(Post 方法)中检索数据:
<!-- A really SIMPLE form -->
<form class="" action="/Contact" method="post">
<input type="text" name="Contact[Name]" value="Something">
<input type="text" name="Contact[Email]" value="Else">
<textarea name="Contact[Message]">For this message</textarea>
<button type="submit">Submit</button>
</form>
在 PHP 中,我会简单地使用它来获取数据:
<?php
print_r($_POST["Contact"])
?>
// Output would be something like this:
Array
(
[Name] => Something
[Email] => Else
[Message] => For this message
)
但是在进行中......要么我一一得到要么整个事情但不是 Contact[] 数组,例如 PHP
我想到了2个解决方案:
1)一一获取:
// r := *http.Request
err := r.ParseForm()
if err != nil {
w.Write([]byte(err.Error()))
return
}
contact := make(map[string]string)
contact["Name"] = r.PostFormValue("Contact[Name]")
contact["Email"] = r.PostFormValue("Contact[Email]")
contact["Message"] = r.PostFormValue("Contact[Message]")
fmt.Println(contact)
// Output
map[Name:Something Email:Else Message:For this Message]
请注意,地图键是整体:“Contact[Name]”...
2)范围整个地图r.Form和“解析|获得”这些值与前缀“Contact[”,然后用空字符串替换“Contact[”和“]”,这样我就可以得到表单数组键只有这样的PHP示例
我自己完成了这项工作,但是......覆盖整个表格可能不是一个好主意(?)
// ContactPost process the form sent by the user
func ContactPost(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
err := r.ParseForm()
if err != nil {
w.Write([]byte(err.Error()))
return
}
contact := make(map[string]string)
for i := range r.Form {
if strings.HasPrefix(i, "Contact[") {
rp := strings.NewReplacer("Contact[", "", "]", "")
contact[rp.Replace(i)] = r.Form.Get(i)
}
}
w.Write([]byte(fmt.Sprint(contact)))
}
//Output
map[Name:Something Email:Else Message:For this Message]
两种解决方案都给我相同的输出......但在第二个例子中,我不一定需要知道“Contact[]”的键
我知道......我可能会忘记那个“表单数组”并name="Email"在我的输入上使用并一个一个地检索但是......我已经经历了一些场景,我使用包含超过2个数据数组的一个表单和对每个人做不同的事情,比如 ORM
问题 1:有没有更简单的方法可以像 PHP 那样将我的表单数组作为 Golang 中的实际地图?
问题 2:我是应该一个一个地检索数据(很乏味,我可能会在某个时候更改表单数据并重新编译...)还是像我在第二个示例中所做的那样迭代整个过程。
对不起,我的英语不好......提前致谢!
阿晨1998
小怪兽爱吃肉
万千封印
相关分类