周五 2016.12.09
这个简单的 POST 处理程序将在 localhost:8080 运行时提取表单值。[ 1 ]
但是,当部署到 AppSpot 时,这些值为空字符串。将表单操作更改为“GET”在 localhost:8080 和在 AppSpot 部署时都有效。
尝试了 r.PostFormValue("myValue") 和 r.FormValue("myValue") 但都返回 "" r.Method 返回 "POST"
甚至尝试添加: enctype="multipart/form-data" 到表单元素
谢谢你调查这个,罗宾
周六 2016.12.10
续:来自上面的GAEfan
试试: r.ParseForm() myVal = r.Form["myValue"]
尽管当前表单 Html 确实验证了 ttps://validator.w3.org/,但我确实花时间变得更正式,并按照建议添加了“类型”属性。
<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><title>Get Form POST Value</title></head>
<body>
<form method="POST" action="/post" enctype="multipart/form-data">
<input type="text" name="myValue" value="qwert">
<input type="text" name="email" value="my@email.com">
<input type="text" name="data" value="somedata">
<button>Send</button>
</form>
</body>
</html>
问题似乎在响应中。r.Body 在 AppSpot 部署时始终为 Nil。即使在表单值提取之前使用“ defer r.Body.Close() ”,AppSpot 始终返回“http: invalid Read on closed Body” 由于表单值是主体响应的一部分,这可以解释为什么这些值总是“”
ref: ttp://www.w3schools.com/tags/ref_httpmethods.asp “请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息正文中发送的:”
func postHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
fmt.Fprintf(w, "<br>r.FormValue(\"myValue\") [%s]", r.FormValue("myValue"))
// and the suggestion from earlier
r.ParseForm()
myVal := r.Form["myValue"]
fmt.Fprintf(w, "<br>myVal [%s]", myVal)
bod, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "<br>ERROR: ioutil.ReadAll(r.Body): [%s]", err)
甚至尝试过:ttps://cloud.google.com/appengine/docs/go/getting-started/handling-user-input-in-forms 但对于他们的一行表单处理内容来说太复杂了:r.FormValue("内容”)
感谢您对属性的敏锐观察。AppSpot 的 AppEngine 处理问题的方式显然与 localhost 不同,而且我还没有找到合适的教程。