Как перенаправить запрос GET на запрос POST с некоторыми данными? - PullRequest
0 голосов
/ 30 октября 2018

Когда пользователь нажимает на определенный URL-адрес с помощью запроса GET, я бы хотел перенаправить его на запрос POST в другом месте.

package main


import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func old(w http.ResponseWriter, r *http.Request) {
    newURL := "/new"
    var bdy = []byte(`title=Buy cheese and bread for breakfast.`)

    r.Method = "POST"
    r.URL, _ = url.Parse(newURL)
    r.RequestURI = newURL
    r.Body = ioutil.NopCloser(bytes.NewReader(bdy))
    r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    http.Redirect(w, r, newURL, 302)
}

func new(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    fmt.Printf("Method:%v\n", r.Method)
    fmt.Printf("Title:%v\n", r.Form.Get("title"))
}

func main() {
    http.HandleFunc("/", old)
    http.HandleFunc("/new", new)
    port := 8000
    fmt.Printf("listening on %v\n", port)
    if err := http.ListenAndServe(fmt.Sprintf(":%v", port), nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

Когда я нажимаю "/", меня перенаправляют на "/ new", но с запросом GET и без данных формы:

Method:GET
Title:

Если я закручиваю "/ new" напрямую, я получаю:

curl -XPOST localhost:8000/new -d "title=Buy cheese and bread for breakfast."

Method:POST
Title:Buy cheese and bread for breakfast.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

HTTP-перенаправление (то есть ответ с кодом состояния 301, 302, 307,308 и Location заголовок) может только перенаправить существующий запрос в другое местоположение и не изменять полезную нагрузку запроса. Он может добавить некоторые куки в заголовок ответа.

Чтобы автоматически изменить запрос GET на запрос POST с определенной полезной нагрузкой, вы можете попытаться отправить клиенту страницу HTML с <form method=POST... и полезной нагрузкой со скрытыми полями ввода, например, <input name=... value=... type=hidden>, а затем добавить некоторые JavaScript на страницу, которая автоматически отправляет форму. Но этот вид взлома будет работать только в браузерах и только если JavaScript включен и не будет работать со всеми видами полезных нагрузок.

Чтобы сохранить совместимость с более широким кругом клиентов, вероятно, лучше спроектировать его по-другому, то есть оставить запрос GET в перенаправлении, но передать необходимую полезную нагрузку в качестве параметра новой цели, т.е. http://new.target/foo?payload=..... Но детали зависят от того, с чем может справиться цель запроса.

0 голосов
/ 31 октября 2018

Я никогда не слышал об изменении глагола с GET на POST. Я предполагаю, что это невозможно, потому что POST предполагает тело тела (однако может быть пустым), а GET - нет. Так что в общем случае браузер не сможет взять тело из ничего. В противном случае возможно: вы можете отправить 302 редирект после записи, чтобы браузер выполнял загрузку. Также можно сохранить глагол с кодом ответа 307.

Попробуйте переосмыслить взаимодействие между браузером и сервером. Может быть, вы можете перенаправить POST в другое место для решения задачи?

0 голосов
/ 30 октября 2018

К сожалению, я не верю, что редирект может изменить глагол (например, GET, POST) или добавить данные в запрос. Он может только изменить URL.

См. Redirect () для получения дополнительной информации.

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