Извлечение параметра URL-адреса перенаправления asna в Google App Engine в golang
Мой URL перенаправления oauth asana - что-то вроде
https://testapp.appspot.com/api/redirect.asana
Я не уверен, как получить access_token сейчас.
Примечание: если я меняюсь? к # тогда он работает нормально, используя r.FormValue("access_token").
1 ответ
Причина по которой r.FormValue()
не получается, потому что параметры URL разделены ?
но в вашем URL это не так.
#
используется для разделения фрагмента для ссылок, поэтому ваш access_token
должен быть в r.URL.Fragment
... но это не так.
Вы не можете проверить это из браузера
Фрагменты не отправляются на сервер, фрагменты для браузеров. Была проблема, покрывающая это:
net / http: поля документа, установленные в Request.URL в обработчике #3805
Он также включен в документ http.Request
:
Для запросов к серверу URL анализируется из URI, предоставленного в строке запроса, как хранится в RequestURI. Для большинства запросов поля, отличные от Path и RawQuery, будут пустыми. (См. RFC 2616, раздел 5.1.2)
Код, чтобы получить его из запроса
Если клиент без браузера отправляет его как часть пути запроса, вы можете использовать простой string
операции для получения значения токена: это часть после =
персонаж. Ты можешь использовать strings.Index()
найти "="
:
raw := r.URL.Path
if idx := strings.Index(raw, "="); idx >= 0 && idx < len(raw)-1 {
token := raw[idx+1:]
fmt.Fprintln(w, "Token:", token)
}
Выход:
Token: 123456789
В качестве альтернативного решения вы также можете использовать strings.Split()
разделить его на "="
, 2-й элемент будет значением токена:
parts := strings.Split(r.URL.Path, "=")
fmt.Fprintln(w, "Parts:", parts)
if len(parts) == 2 {
fmt.Fprintln(w, "Token:", parts[1])
}
Выход:
[/api/redirect.asana#access_token 123456789]
Token: 123456789
Код для проверки
Вот код, использующий net/http
позвонить на ваш сервер, который будет отправлять путь "/api/redirect.asana#access_token=123456789"
, и он напечатает тело ответа на стандартный вывод (консоль):
c := &http.Client{}
req, err := http.NewRequest("GET", "http://localhost:8080/", nil)
if err != nil {
panic(err)
}
req.URL.Path = "/api/redirect.asana#access_token=123456789"
resp, err := c.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)