web-dev-qa-db-fra.com

Comment puis-je faire une demande avec un jeton au porteur dans Go

J'ai besoin de faire une demande GET à une API avec un jeton au porteur dans la demande d'autorisation. Comment puis-je faire cela dans Go? J'ai le code suivant, mais je n'ai pas réussi.

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)))
}
6
Matheus Alcântara

Pour contrôler les en-têtes de client HTTP, la politique de redirection et d'autres paramètres, créez un client:

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)))
}

Le transport du client a généralement un état interne (mises en cache TCP), donc les clients doivent être réutilisés au lieu d'être créés selon les besoins. Les clients sont sûrs pour une utilisation simultanée par plusieurs goroutines.

Un client est de niveau supérieur à un RoundTripper (tel que Transport) et gère en outre les détails HTTP tels que les cookies et les redirections.

Pour plus d'informations sur Client et Transport vérifiez les spécifications de Golang pour le package net/http

15
Himanshu

J'ai dû ajouter une fonction client.CheckRedirect (vue ci-dessous) afin de passer le jeton Bearer à l'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))
    }
}
1
Philip Krause

J'ai fait une bibliothèque super-peu-basique pour exécuter la requête de base comme:

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))
}

Ici vous pouvez trouver l'implémentation request:
https://github.com/alessiosavi/Requests/blob/e7ca66bde738b6224fba2b6f146a8dbee67d3323/Requests.go

Ici vous pouvez trouver comment j'utilise la bibliothèque pour Bearer Auth et d'autres types d'authentification:
https://github.com/alessiosavi/GoCloudant/blob/a8ad3a7990f04ea728bb327d6faea6af3e5455ca/cloudant.go

0
alessiosavi