首页 > 解决方案 > 从 Javascript 中的 FormData 获取数据并在 Golang 中处理

问题描述

我正在尝试通过 Javascript 从 HTML 网页中获取一些数据到我的 Golang 网络服务器。但是那里似乎没有收到数据。

这是我的 Javascript 函数,在我的网页下拉菜单中选择某些内容时会调用它:

async function onDataFormatSelect(dataFormat) 
    {
      console.log('Change DataFormat', dataFormat);
      let formDataSelect = new FormData();
      formDataSelect.append("cmd", "change");
      const fetchoptions  = {
        method: 'POST',
        body: formDataSelect,
      };

      let r = await fetch('/myURL', fetchoptions);
      console.log('HTTP response code.', r.status);
      for (var pair of formDataSelect.entries()) {
        console.log(pair[0]+ ', ' + pair[1]); 
      }
    }

在我的 Go Webserver 的 SetupRoutes() 中,URL 得到一个 Handler:

    http.HandleFunc("/myURL", urlHandler)

这是我的处理程序:

func urlHandler(w http.ResponseWriter, r *http.Request) {
    

    if r.Method == "POST" {
        r.ParseForm()

        topicName := r.FormValue("topicName")
        cmd := r.FormValue("cmd")
        log.Println("action: " + cmd)
        switch cmd {
        ...
        case "change": //Change DataFormat of Topic
            log.Println("cmd is " + cmd)
            newDataFormat := r.FormValue("dataFormat")
            //Call another function
        default:
            log.Println("unknown command: " + cmd)
        }

    } else {
        log.Println("using wrong method (GET)")
    }

    http.Redirect(w, r, appdata.Status.ProxyRedirect, http.StatusMovedPermanently)
}

Javascript 的输出是正确的。FormDataSelect 已正确填写,但在 Go 中“cmd”不存在。不知何故,在另一个具有相同设置的功能中,一切正常。

除了使用 XMLHttpRequest 之外,你能帮助我吗?或者你有什么解决方法吗?

标签: javascriptgo

解决方案


FormData 对象旨在支持发布文件,因此它们始终发送多部分请求。

请参阅Go 的 http 模块的文档。

你正在使用parseForm它说:

当 Content-Type 不是 application/x-www-form-urlencoded 时,不读取请求 Body,r.PostForm 被初始化为非 nil 的空值

你需要ParseMultipartForm改用。


推荐阅读