Golang中如何为HTTP GET请求添加基本认证
Golang中如何为HTTP GET请求添加基本认证 在为HTTP GET请求添加基本身份验证时遇到了问题。针对该接口的Curl命令似乎可以正常工作。但是,当我在Go脚本中尝试调用时,却收到了403禁止访问的错误。任何帮助都将不胜感激,谢谢。
func main() {
var url = "http://localhost:4002/wallet/address"
req, err := http.Get(url)
if err != nil {
panic(err)
}
req.Header.Add("Authorization", "Basic dGVzdHVzZXI6dGVzdHVzZXI=")
defer req.Body.Close()
fmt.Println(req)
}
更多关于Golang中如何为HTTP GET请求添加基本认证的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我成功解决了这个问题。关键在于需要创建一个客户端对象来设置请求头。以下是可运行的代码。
var url = "http://localhost:4002/wallet/address"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Basic dGVzdHVzZXI6dGVzdHVzZXI=")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
data, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(data))
更多关于Golang中如何为HTTP GET请求添加基本认证的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码存在两个主要问题:
- 请求创建顺序错误:
http.Get()会立即执行请求,你需要在创建请求对象时设置头部,而不是在执行之后。 - 认证信息错误:基本认证需要正确的 base64 编码格式。
以下是修正后的代码:
package main
import (
"encoding/base64"
"fmt"
"net/http"
)
func main() {
url := "http://localhost:4002/wallet/address"
username := "testuser"
password := "testuser"
// 创建请求对象
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
// 设置基本认证头部
auth := username + ":" + password
basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
req.Header.Add("Authorization", basicAuth)
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 输出响应状态
fmt.Printf("Status: %s\n", resp.Status)
fmt.Printf("StatusCode: %d\n", resp.StatusCode)
}
如果你的用户名和密码确实是 “testuser:testuser”,那么 base64 编码后的字符串应该是 dGVzdHVzZXI6dGVzdHVzZXI=。但为了确保正确性,建议使用 base64.StdEncoding.EncodeToString 动态生成。
如果你的 curl 命令能正常工作,可以这样对比验证:
curl -u testuser:testuser http://localhost:4002/wallet/address
对应的 Go 代码:
// 使用 http.Request.SetBasicAuth 方法(更简洁的方式)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
req.SetBasicAuth(username, password)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
调试建议:添加以下代码查看实际发送的请求头部:
// 打印请求头部用于调试
for k, v := range req.Header {
fmt.Printf("%s: %v\n", k, v)
}

