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


你的代码存在两个主要问题:

  1. 请求创建顺序错误http.Get() 会立即执行请求,你需要在创建请求对象时设置头部,而不是在执行之后。
  2. 认证信息错误:基本认证需要正确的 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)
}
回到顶部