我是一名PHP开发人员,但目前正在迁移到Golang...我正在try 从表单(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
我想到了两种解决方案:
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示例才能获得表单数组键
我自己go 做这项工作,但是...在整个表单上进行扫描可能不是一个好主意(?)
// 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"
,然后一个接一个地检索,但是...我已经介绍了一些场景,其中我使用一个包含两个以上数据数组的表单,并对每个表单执行不同的操作,比如ORMs
Question 1:有没有像PHP一样,用Golang将我的表单数组作为实际映射的更简单的方法?
Question 2:我应该逐个检索数据吗(尽可能繁琐,我可能会在某个时候更改表单数据并重新编译……)或者像我在第二个示例中所做的那样迭代整个过程.
抱歉我的英语不好...提前谢谢!