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