Golang中如何将FormData解析为Map对象?
Golang中如何将FormData解析为Map对象? 你好,希望你今天/今晚过得愉快。
首先为链接的使用表示歉意,但作为新用户,我只能使用两个 Markdown 链接。
我正在尝试在提交时解析一个表单,以获取其键/值。我使用的是 FormData 接口 https://developer.mozilla.org/en-US/docs/Web/API/FormData,配合 GoWebApi 的 HTML 包来实现:https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/html。
但是,我无法遍历它,因为我对如何为 ForEach 方法设置回调感到困惑:https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/html?utm_source=gopls#FormData.ForEach
以下是 ForEach 函数的定义:
func (*FormData) ForEach ¶
func (_this *FormData) ForEach(callback *FormDataForEach, optionalThisForCallbackArgument interface{})
这是我的代码:
func (p *Page) onInc(e *vecty.Event) {
formEl := html.HTMLFormElementFromJS(DocumentGetElementById"form333").JSValue())
formData := html.NewFormData(formEl)
dataLoop := formData.ForEach()
---< callback here >----
for k, v := range dataLoop {
println(k,v)
}
}
以下是表单元素:
<form id="form333" style="margin: 0px;"><label for="Fname">First name:</label><br><input type="text" id="Fname" name="Fname"><br><label for="Lname">Last name:</label><br><input id="Lname" type="text" name="Lname"><input type="submit" value="Text input" class="button is-danger"></form>
根据文档,我需要创建一个 FormDataForEach 回调以及 optionalThisForCallbackArgument interface{},但在过去 24 小时尝试后,我仍然不知道如何操作,而且我是 Go 语言的新手。
我还尝试了其他函数,例如:
- FormDataForEachFromJS -
https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/html?utm_source=gopls#FormDataForEachFromJS - FormDataEntryIteratorValueFromJS
https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/html?utm_source=gopls#FormDataEntryIteratorValueFromJS - ArrayFromJS
https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/javascript#ArrayFromJS来自https://pkg.go.dev/github.com/gowebapi/webapi@v0.0.0-20220111190827-0cb1f8ede1ac/javascript
到目前为止,我还没能让它正常工作,完全搞糊涂了。
所以,如果有人能向我展示如何处理这个回调,或者任何其他获取表单数据键值对的方法,我将不胜感激。
提前感谢。
注意:
- 我没有使用
syscall/js,因为即使我在 vscode 的 settings.json 中设置了"go.toolsEnvVars": { "GOARCH":"wasm", "GOOS":"js", }, "go.testEnvVars": {"GOARCH":"wasm", "GOOS":"js", },它也不起作用。 - 我没有使用其他有用的库,例如
https://github.com/gorilla/schema,因为我只使用 DOM 而不使用 http.request。
更多关于Golang中如何将FormData解析为Map对象?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中如何将FormData解析为Map对象?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go WebAssembly中处理FormData的回调确实需要一些技巧。以下是使用gowebapi包解析FormData为map的完整示例:
package main
import (
"fmt"
"github.com/gowebapi/webapi/html"
"syscall/js"
)
func (p *Page) onInc(e *vecty.Event) {
// 获取表单元素
formEl := html.HTMLFormElementFromJS(
js.Global().Get("document").Call("getElementById", "form333"),
)
// 创建FormData
formData := html.NewFormData(formEl)
// 创建map来存储结果
result := make(map[string]string)
// 创建回调函数
callback := html.FormDataForEachCallback(func(
value *html.FormDataEntryValue,
key string,
parent *html.FormData,
) {
// 获取字符串值
strValue := value.String()
result[key] = strValue
})
// 将回调包装为FormDataForEach
forEachCallback := html.FormDataForEachFromJS(callback.JSValue())
// 执行遍历
formData.ForEach(forEachCallback, nil)
// 打印结果
for k, v := range result {
fmt.Printf("Key: %s, Value: %s\n", k, v)
}
// 或者直接使用回调内部处理
formData.ForEach(forEachCallback, nil)
}
如果你想要更简洁的版本,这里是一个封装好的函数:
func parseFormDataToMap(formData *html.FormData) map[string]string {
data := make(map[string]string)
callback := html.FormDataForEachCallback(func(
value *html.FormDataEntryValue,
key string,
parent *html.FormData,
) {
data[key] = value.String()
})
forEachCallback := html.FormDataForEachFromJS(callback.JSValue())
formData.ForEach(forEachCallback, nil)
return data
}
// 使用示例
func (p *Page) onInc(e *vecty.Event) {
formEl := html.HTMLFormElementFromJS(
js.Global().Get("document").Call("getElementById", "form333"),
)
formData := html.NewFormData(formEl)
formMap := parseFormDataToMap(formData)
// 访问数据
firstName := formMap["Fname"]
lastName := formMap["Lname"]
fmt.Printf("First: %s, Last: %s\n", firstName, lastName)
}
对于处理文件上传的情况,需要检查值类型:
func parseFormData(formData *html.FormData) map[string]interface{} {
result := make(map[string]interface{})
callback := html.FormDataForEachCallback(func(
value *html.FormDataEntryValue,
key string,
parent *html.FormData,
) {
// 检查是否是文件
if file := value.File(); file != nil {
result[key] = file
} else {
result[key] = value.String()
}
})
forEachCallback := html.FormDataForEachFromJS(callback.JSValue())
formData.ForEach(forEachCallback, nil)
return result
}
关键点是使用html.FormDataForEachCallback类型创建回调函数,然后通过FormDataForEachFromJS将其转换为需要的类型。回调函数接收三个参数:值、键和父FormData对象。

