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/ を検証しますが、時間をかけてより正式になり、提案どおりに「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 とは異なる方法で問題を処理しているようで、適切なチュートリアルをまだ見つけていません。

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() ステートメントの前後で、入力したフォーム データのサイズに応じて値が変化することがわかりました。この値は本文の長さ 0 とは異なるため、フォームがデータを送信していることがわかります。これにより、r.Body ストリームが閉じられました。そのコード行を削除すると、本文の内容をデコードできました。

賢者への注意。. .

于 2016-12-10T20:29:47.467 に答える