如何从 Golang 中的 javascript XMLHttpRequest 读取 POST

这是调用的javascript函数:


function cwk_submit_form() {

   var form = document.getElementById("FORM_ID")

   var XHR = new XMLHttpRequest();



   const FD = new FormData( form );

   for (const element of FD.entries()) {

       console.log(element)

   }


   XHR.open( "POST", "http://localhost:8080/post_data" );

   XHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


   XHR.send( FD );

}

我console.log在里面提到这确实打印出正确的数据,这意味着问题似乎出在数据的传输方式上。


接收响应的 Golang 代码是:


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

    log.Println("post was called")


    r.ParseForm()

    for key, value := range r.Form {

        log.Printf("%s = %s\n", key, value)

    }

}


此 for 循环不打印任何内容。


如果我像这样使用 HTML 表单提交:


<form action="//localhost:8080/post_data" method="POST">

    <input type="text" name="field1" value="" maxLength="20"/>

        

    <input type="text" name="field2" value="" maxLength="20"/>

        

    <input type="submit" value="Sign in"/>

</form>

然后上面的 Golang 代码工作正常,这让我相信 XMLHttpRequest 格式是问题所在。


侃侃尔雅
浏览 89回答 1
1回答

蝴蝶不菲

你猜对了,你的js代码有问题。对于所有请求,ParseForm 解析来自 URL 的原始查询并更新 r.Form。因此,当Content-Type您发送并且实际内容类型与application/x-www-form-urlencoded您的 HTML 表单案例中发生的匹配时,它将起作用。另一方面,当您使用 时FormData,它将作为multipart/form-data.您需要将您的替换XHR.send(FD)为XHR.send(new URLSearchParams(FD))以发送数据application/x-www-form-urlencoded。
打开App,查看更多内容
随时随地看视频慕课网APP