为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Golang 中的 javascript XMLHttpRequest 读取 POST

如何从 Golang 中的 javascript XMLHttpRequest 读取 POST

Go
侃侃尔雅 2022-12-13 16:15:53
这是调用的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 格式是问题所在。
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

你猜对了,你的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


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信