Значения POST формы Html извлекаются нормально, когда на локальном хосте: 8080, но пустая строка при развертывании в AppSpot Golang

Пт 2016.12.09

Этот простой обработчик POST будет извлекать значения формы при работе на локальном хосте: 8080. [1]

Однако при развертывании в AppSpot значения представляют собой пустую строку. Изменение действия формы на «GET» работает как на локальном хосте: 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="[email protected]">
    <input type="text" name="data" value="somedata">
    <button>Send</button>
  </form>
</body>
</html>

Проблема, кажется, в ответе. r.Body всегда имеет значение Nil при развертывании в AppSpot. Даже если " defer r.Body.Close () " предшествует извлечению значения формы, AppSpot всегда возвращает "http: недействительное чтение закрытого тела". Поскольку значения формы являются частью ответа тела, это объясняет, почему значения всегда ""

ref: ttp://www.w3schools.com/tags/ref_httpmethods.asp «Обратите внимание, что строка запроса (пары имя/значение) отправляется в теле сообщения HTTP запроса POST:»

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, но это слишком сложно для обработки одной строки формы Content: r.FormValue(" содержание")

Спасибо за внимательное наблюдение за атрибутами. AppEngine в AppSpot, по-видимому, решает вопросы иначе, чем на локальном хосте, и мне еще предстоит найти подходящее руководство.


person Robin    schedule 10.12.2016    source источник
comment
Требуется больше кода. Как для формы, так и для ее обработчика. Является ли r request? Если да, то вам нужно r.POST....   -  person GAEfan    schedule 10.12.2016


Ответы (2)


Пытаться:

r.ParseForm()

myVal = r.Form["myValue"]
person GAEfan    schedule 10.12.2016
comment
Благодарю за ваш ответ. Быстрая операция вырезания и вставки показала тот же результат. Работает на локальном хосте: 8080, но не работает при развертывании в AppSpot. - person Robin; 10.12.2016
comment
Возможно, неправильный ввод формы вызывает проблему. Попробуйте: <input type="text" name="myValue"> - person GAEfan; 10.12.2016
comment
Благодарим вас за внимательное наблюдение за атрибутами элементов, несмотря на то, что HTML-контент прошел проверку. Я продолжу в блоке редактирования, так как в этом разделе ответа количество символов ограничено до 600. - person Robin; 10.12.2016

Сб 2016.12.10

Обнаружил эту аномалию после нескольких часов выдергивания волос:

Чтобы подтвердить, что форма отправляет контент, я обнаружил Content-Length, используя

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

до и после оператора defer r.Body.Close() и увидел, что значение изменяется в зависимости от размера данных формы, которые я ввел. Это значение отличалось от нулевой длины тела, поэтому я знал, что форма отправляет данные. Что это также сделало, так это закрыло поток r.Body. Удаление этой строки кода позволило расшифровать содержимое тела.

Слово предостережения для мудрых. . .

person Robin    schedule 10.12.2016