Html Form POST值在localhost:8080时提取正常,但在AppSpot Golang上部署时为空字符串

时间:2016-12-10 01:18:36

标签: google-app-engine google-app-engine-go

2016年12月12日

这个简单的POST处理程序将在localhost:8080上运行时提取表单值。 [1]

但是,部署到AppSpot时,值为空字符串。将表单操作更改为' GET'在localhost:8080以及部署在AppSpot时都可以使用。

尝试了r.PostFormValue(" myValue")和r.FormValue(" myValue")但都返回"" r.Method返回" POST"

甚至尝试添加:enctype =" multipart / form-data"形成元素

感谢您对此进行调查,Robin

Golang source

周六2016.12.10

cont:来自上面的GAEfan

尝试: r.ParseForm() myVal = r.Form [" myValue"]

虽然目前的形式Html确实验证了ttps://validator.w3.org/我确实花时间更正式,并添加了'类型'属性如建议。

› lein test :integration

lein test fixture.core-test
enabling expensive fixture...
doing expensive computation and acquiring resources...
first integration test
yay, expensive thing is done!
second integration test

Ran 2 tests containing 0 assertions.
0 failures, 0 errors.

问题似乎在回应中。 r.Body在AppSpot部署时始终是Nil。即使有一个"推迟r.Body.Close()"在表单值提取之前,AppSpot始终返回" http:无效读取封闭的Body"由于表单值是正文响应的一部分,这可以解释为什么值总是""

参考:ttp://www.w3schools.com/tags/ref_httpmethods.asp "请注意,查询字符串(名称/值对)在POST请求的HTTP消息正文中发送:"

<!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>

甚至尝试过:ttps://cloud.google.com/appengine/docs/go/getting-started/handling-user-input-in-forms但对于他们的一行表单处理内容太复杂了:r。 FormValue(&#34;内容&#34)

感谢您对属性的敏锐观察。 AppSpot的AppEngine显然处理与localhost不同的事情,我还没有找到合适的教程。

2 个答案:

答案 0 :(得分:0)

尝试:

r.ParseForm()

myVal = r.Form["myValue"]

答案 1 :(得分:0)

周六2016.12.10

经过数小时的拔毛后发现了这种异常现象:

要确认表单是否正在发送内容,我已使用

检测到内容长度
fmt.Fprintf(w, "<br>Request Content-Length [%v]", r.Header.Get("Content-Length"))

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

对智者要谨慎。 。 。