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/ を検証しますが、時間をかけてより正式になり、提案どおりに「type」属性を追加しました。
<!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: クローズされた 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 しかし、1 行のフォーム処理には複雑すぎます Content: r.FormValue("コンテンツ")
属性についての鋭い観察をありがとう。AppSpot の AppEngine は、どうやら localhost とは異なる方法で問題を処理しているようで、適切なチュートリアルをまだ見つけていません。