Как сделать запрос с токеном на предъявителя в Go

Мне нужно сделать запрос GET в API, но мне нужно отправить токен Bearer в запросе авторизации. Как я могу сделать это в Go? У меня есть следующий код, но у меня нет успеха.

package main

import (
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    url := "https://api.globalcode.com.br/v1/publico/eventos"

    resp, err := http.Get(url)
    resp.Header.Add("Bearer", "token")
    if err != nil {
        log.Println("Erro ao realizar request.\n[ERRO] -", err)
    }

    body, _ := ioutil.ReadAll(resp.Body)
    log.Println(string([]byte(body)))
}

1 ответ

Для управления заголовками клиентов HTTP, политикой перенаправления и другими параметрами создайте клиент:

package main

import (
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    url := "https://api.globalcode.com.br/v1/publico/eventos"

    // Create a Bearer string by appending string access token
    var bearer = "Bearer " + <ACCESS TOKEN HERE>

    // Create a new request using http
    req, err := http.NewRequest("GET", url, nil)

    // add authorization header to the req
    req.Header.Add("Authorization", bearer)

    // Send req using http Client
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Println("Error on response.\n[ERRO] -", err)
    }

    body, _ := ioutil.ReadAll(resp.Body)
    log.Println(string([]byte(body)))
}

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

Клиент более высокого уровня, чем RoundTripper (например, Transport), и дополнительно обрабатывает детали HTTP, такие как cookie-файлы и перенаправления.

Для получения дополнительной информации о клиенте и транспорте проверьте спецификации golang для пакета net / http

Мне пришлось добавить функцию client.CheckRedirect (см. Ниже), чтобы передать токен Bearer в API.

bearer := "Bearer " + token

    req, err := http.NewRequest("GET", url, bytes.NewBuffer(nil))
    req.Header.Set("Authorization", bearer)
    req.Header.Add("Accept", "application/json")

    client := &http.Client{}


    client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
        for key, val := range via[0].Header {
            req.Header[key] = val
        }
        return err
    }
    resp, err := client.Do(req)
    if err != nil {
        log.Println("Error on response.\n[ERRO] -", err)
    } else {
        defer resp.Body.Close()
        data, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(data))
    }
}

Я сделал супер-маленькую базовую библиотеку для выполнения базового запроса, например:

package main
import (
     request "github.com/alessiosavi/Requests"
)

func main(){
    // Create a key-value list of headers
    headers := request.CreateHeaderList(`Accept`, `application/json`, "Authorization", "Bearer "+auth.IAMToken)
    resp :=request.SendRequest(`http://your_site.com`, `GET`, headers, nil))
}

Здесь вы можете найти requestреализация:
https://github.com/alessiosavi/Requests/blob/e7ca66bde738b6224fba2b6f146a8dbee67d3323/Requests.go

Здесь вы можете узнать, как я использую библиотеку для Bearer Auth и другого типа аутентификации:
https://github.com/alessiosavi/GoCloudant/blob/a8ad3a7990f04ea728bb327d6faea6af3e5455ca/cloudant.go

Приложение добавляет токен к ответу, возвращенному с сервера. Для исправления добавьте токен в запрос, отправленный на сервер.

http.Get Функция, используемая в вопросе, является вспомогательной функцией, которая создает и выполняет запрос с HTTP-клиентом по умолчанию. Чтобы установить заголовок запроса, приложение должно написать код для этих отдельных шагов. Вот код:

func main() {
    url := "https://api.globalcode.com.br/v1/publico/eventos"

    // Create request object.
    req, err := http.NewRequest("GET", url, nil)

    // Set the header in the request.
    req.Header.Set("Bearer", "token")

    // Execute the request.
    resp, err := http.DefaultClient.Do(req)

    if err != nil {
        log.Fatal("Erro ao realizar request.\n[ERRO] -", err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    os.Stdout.Write(body)
}
Другие вопросы по тегам