2016-12-10 3 views
0

Пт 2016.12.09значения Html Form POST извлеченный хорошо, когда на локальном хосте: 8080, но пустая строка при развертывании на AppSpot Golang

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

Однако при развертывании в AppSpot значения представляют собой пустую строку. Изменение действия формы на «GET» работает как на localhost: 8080, так и при развертывании в AppSpot.

Пробовал r.PostFormValue ("MyValue") и r.FormValue ("MyValue"), но и возвращение "" r.Method возвращает "POST"

Даже попытался добавить: ENCTYPE = "многочастному/form- данные», чтобы сформировать элемент

Спасибо за глядя на это, Робин

Golang source

Сб 2016.12.10

продолжение: Из GAEfan выше

Try: 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="[email protected]"> 
    <input type="text" name="data" value="somedata"> 
    <button>Send</button> 
    </form> 
</body> 
</html> 

Вопрос, похоже, находится в ответе. r.Body всегда является Nil при развертывании в AppSpot. Даже если «exfer r.Body.Close()» предшествует извлечению значения формы, AppSpot всегда возвращает «http: invalid Read on closed Body». Поскольку значения формы являются частью ответа тела, это объясняет, почему значения всегда «"

исх: TTP: //www.w3schools.com/tags/ref_httpmethods.asp «Обратите внимание, что строка запроса (пар имя/значение) передается в теле 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 ("content")

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

+0

Дополнительный код необходим. И для формы, и для ее обработчика. Это 'r'' запрос'? Если это так, вам нужно 'r.POST.' ... – GAEfan

ответ

0

Try:

r.ParseForm() 

myVal = r.Form["myValue"] 
+0

Благодарим вас за ответ. Быстрый вырез-n-paste показал тот же результат. Работает на localhost: 8080, но не работает при развертывании в AppSpot. – Robin

+0

Возможно, неправильный ввод формы вызывает проблему. Попробуйте: '' – GAEfan

+0

Благодарим вас за ваше пристальное наблюдение за атрибутами элементов, даже если содержание Html подтвердилось. Я продолжу в блоке редактирования, так как этот раздел ответа ограничил количество символов до 600 – Robin

0

Сб 2016.12.10

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

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

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

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

Предупреждение мудрым. , ,