如何在Go中使用承载令牌提出请求

时间:2018-07-21 01:51:45

标签: http go request authorization

我需要使用授权请求中的承载令牌向API发出GET请求。如何在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)))
}

4 个答案:

答案 0 :(得分:6)

要控制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   连接),因此应重用客户端,而不是将其创建为   需要。客户端可以安全地被多个goroutine并发使用。

     

客户端比RoundTripper(例如Transport)更高级别,并且   另外还处理HTTP详细信息,例如cookie和重定向。

有关Client and Transport的更多信息,请检查net / http软件包的golang规范

答案 1 :(得分:1)

我必须添加一个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))
    }
}

答案 2 :(得分:0)

应用程序将令牌添加到从服务器返回的响应中。要解决此问题,请将令牌添加到发送到服务器的请求中。

该问题中使用的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)
}

答案 3 :(得分:0)

我制作了一个超小基本库来执行基本请求,例如:

_Object

在这里您可以找到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)) } 实现:
https://github.com/alessiosavi/Requests/blob/e7ca66bde738b6224fba2b6f146a8dbee67d3323/Requests.go

在这里您可以找到我如何将库用于Bearer Auth和其他auth类型:
https://github.com/alessiosavi/GoCloudant/blob/a8ad3a7990f04ea728bb327d6faea6af3e5455ca/cloudant.go