Каково поведение формы браузера по умолчанию для метода POST? - PullRequest
0 голосов
/ 01 октября 2019

Обычно я использую JSON API и SPA для создания веб-приложений, но я пытаюсь научиться использовать более простой метод на стороне сервера шаблонов и поведение форм по умолчанию с Go.

Я делаю что-то очень похожее на то, что видно здесь . Единственное отличие состоит в том, что я изменил action на "/" в форме для простоты и обработал GET и POST из одного и того же обработчика (фильтрация по типу метода).

Шаблон на стороне сервера

<form action="/" method="post"   >

         ...

        <div class="form-group">
            <label for="myname">Dev Name</label>
            <input type="text" class="form-control" id="myname" name="myname" value="{{.MyDname}}">
        </div>

        <button type="submit" class="btn btn-primary">Update</button>
        </form>

Серверная сторона

func MainPage(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //get request method
    if r.Method == "GET" {
        t, err := template.New("RTL Page").Parse(page)
        if err != nil {
            log.Fatal(err)
        }
        err = t.Execute(w, State)
        if err != nil {
            log.Fatal(err)
        }
    }

    if r.Method == http.MethodPost {
        r.ParseForm()
        ...
    }
}

Начальная веб-страница отображается нормально, данные отправляются корректно в POST, я отвечаю на POST всего лишь 200, но затем моя веб-страница становится пустой.

Как мне сказать браузеру сохранить или перерисовать исходную страницу? Нужно ли отправлять HTML-ответ на POST? Что-то кроме 200?

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

@ Волкер указал, что нужно изменить. На POST нужно было ответить отображаемым HTML, поэтому реальный простой способ исправить это:

func MainPage(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //get request method

    if r.Method == http.MethodPost {
        r.ParseForm()
        ...
    }

  if r.Method == "GET" || r.Method == "POST" {
        t, err := template.New("RTL Page").Parse(page)
        if err != nil {
            log.Fatal(err)
        }
        err = t.Execute(w, State)
        if err != nil {
            log.Fatal(err)
        }
    }

}
0 голосов
/ 01 октября 2019

То, что вы спрашиваете, является основной операцией HTTP. Клиент отправляет запрос, а сервер отвечает на запрос. Если клиент является браузером, браузер отображает ответ.

Для запроса GET браузер отправляет запрос GET на сервер, сервер отвечает HTML-страницей, а браузер отображает ее.

Для запроса POST браузер отправляет запрос POST вместе со значениями, представленными в форме, и сервер должен ответить HTML-страницей, чтобы браузер мог отобразить его. Отображаемый ответ будет POST-ответом, поэтому, если вы перезагрузите эту страницу, она попытается повторно отправить форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...