Как добавить значения в запрос и перенаправить в golang - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть API-шлюз и микро сервисы пользователя. Когда запрос приходит к API-шлюзу, мне нужно добавить некоторые значения до Rediret() его в службу пользователя.

func main(){
    http.HandleFunc("/login", userLogin)

}
func userLogin(res http.ResponseWriter, req *http.Request) {

    uuid := generateUUID()

    // How to add UID to request?
    http.Redirect(res, req, userservice, http.StatusSeeOther)

}

Для этого я использовал метод, описанный здесь .

form,_ := url.ParseQuery(req.URL.RawQuery)
form.Add("uid", "far")
req.URL.RawQuery = form.Encode()

Это всего лишь go и остановка на маршруте входа в систему обслуживания пользователей.

Я также пытался использовать: req.Form.Set("uid","foo")

Это дает pani c.

http: pani c, обслуживающее 127.0.0.1:55076 : назначение записи в nil map

Служба My User:

func main(){
    http.HandleFunc("/login", UserLogin)
}

func UserLogin(res http.ResponseWriter, req *http.Request) {
     req.ParseForm()
     requestID := req.FormValue("uid")
     userID := req.FormValue("userid")

     if userID =="sachith"{
        sendRequest(requestID)
        http.Redirect(res, req, "http://localhost:7070/home", http.StatusSeeOther)
    }

Есть ли способ добавить значения в запрос, который мы получаем для маршрута, и перенаправить его в другую службу

1 Ответ

1 голос
/ 08 апреля 2020

Чтобы добавить параметры запроса в местоположение перенаправления, вы просто добавляете их в аргумент url функции Redirect.

Кроме того, вы не должны изменять аргумент *http.Request, который передается в Redirect, чтобы указать целевое местоположение, это не то, для чего он. Во-первых, его изменение будет влиять только на относительные перенаправления, а это не то, что вы пытаетесь сделать здесь. Во-вторых, url предназначен для этой цели и может последовательно использоваться как для относительного, так и для абсолютного перенаправления. Здесь нет никакого преимущества против дизайна.

apigateway/main.go

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/login", loginHandler)
    http.ListenAndServe(":8080", nil)
}

func loginHandler(w http.ResponseWriter, r *http.Request) {
    uuid := "911cf95b-6b3f-43fd-b695-c80c79145c51" // generate uuid
    http.Redirect(w, r, "http://localhost:8081/login?user_id="+uuid, http.StatusSeeOther)
}

userservice/main.go

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/login", loginHandler)
    http.ListenAndServe(":8081", nil)
}

func loginHandler(w http.ResponseWriter, r *http.Request) {
    uuid := r.URL.Query().Get("user_id")
    w.Write([]byte(uuid))
}
...