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

1 回复

更多关于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对象。

回到顶部