0

周五 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" 到表单元素

谢谢你调查这个,罗宾

Golang 源码

周六 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 不同,而且我还没有找到合适的教程。

4

2 回答 2

0

周六 2016.12.10

在拉了几个小时的头发后发现了这个异常:

为了确认表单正在发送内容,我检测到 Content-Length 使用

fmt.Fprintf(w, "<br>Request Content-Length [%v]", r.Header.Get("Content-Length"))

在 defer r.Body.Close() 语句之前和之后,看到值随着我输入的表单数据的大小而变化。这个值与零的主体长度不同,所以我知道表单正在发送数据。这也做了关闭 r.Body 流。删除该行代码允许对正文内容进行解码。

告诫智者。. .

于 2016-12-10T20:29:47.467 回答
0

尝试:

r.ParseForm()

myVal = r.Form["myValue"]
于 2016-12-10T01:45:12.507 回答