Go语言调用需登录认证的API GET接口的实现问题咨询
解决方法
核心流程是先调用登录接口获取认证凭证,再将凭证附加到数据查询的GET请求中即可,具体实现如下:
步骤1:明确认证逻辑
你在Postman登录后拿到的auth字段就是身份凭证,后续所有业务请求都需要携带该凭证完成校验。首先可以通过浏览器F12的「网络」面板,查看登录成功后调用GET接口时请求头里的认证字段名,常见的有以下几种:
Authorization: Bearer <auth值>- 自定义头比如
X-Auth-Token: <auth值> - 存放在Cookie中,复用http.Client会自动携带
步骤2:完整代码实现
package main import ( "bytes" "encoding/json" "io/ioutil" "log" "net/http" "net/url" ) // 登录接口返回结构体 type LoginResponse struct { Message string `json:"message"` App interface{} `json:"app"` Auth string `json:"auth"` } func main() { // 复用同一个http.Client,自动管理Cookie(如果站点用Cookie认证的话) client := &http.Client{} // -------------------------- 第一步:调用登录接口获取凭证 -------------------------- // 替换为你的实际登录接口地址 loginUrl := "https://web.copiloto.ai/api/login" // 替换为你的实际账号密码,这里按POST提交JSON格式为例,如果是form表单格式请调整 loginParams := map[string]string{ "username": "你的账号", "password": "你的密码", } // 序列化登录参数为JSON loginBody, err := json.Marshal(loginParams) if err != nil { log.Fatalf("序列化登录参数失败: %v", err) } // 构造登录POST请求 loginReq, err := http.NewRequest("POST", loginUrl, bytes.NewBuffer(loginBody)) if err != nil { log.Fatalf("构造登录请求失败: %v", err) } loginReq.Header.Add("Content-Type", "application/json") // 发送登录请求 loginResp, err := client.Do(loginReq) if err != nil { log.Fatalf("发送登录请求失败: %v", err) } defer loginResp.Body.Close() // 解析登录响应 var loginResult LoginResponse err = json.NewDecoder(loginResp.Body).Decode(&loginResult) if err != nil { log.Fatalf("解析登录响应失败: %v", err) } if loginResult.Message != "User successfully authenticated" { log.Fatalf("登录失败: %s", loginResult.Message) } authToken := loginResult.Auth log.Printf("登录成功,拿到凭证: %s", authToken) // -------------------------- 第二步:携带凭证调用GET接口 -------------------------- dataUrl := "https://web.copiloto.ai/api/rawdata?vehicles=238&from=2021-05-20T00:00:00&to=2021-05-20T23:59:59&fields=$basic,ecu_bms1_total_voltage&distance=km" dataReq, err := http.NewRequest("GET", dataUrl, nil) if err != nil { log.Fatalf("构造数据请求失败: %v", err) } dataReq.Header.Add("Content-Type", "application/json") dataReq.Header.Add("X-Hola-Mundo", "Ejemplo") // 这里添加认证头,根据实际字段名调整,下面是最常见的Bearer认证示例 dataReq.Header.Add("Authorization", "Bearer " + authToken) // 如果上面的方式不行,换成自定义头比如: // dataReq.Header.Add("X-Auth-Token", authToken) // 如果是Cookie认证的话,不用手动加头,复用client会自动携带 // 发送数据请求 dataResp, err := client.Do(dataReq) if err != nil { log.Fatalf("发送数据请求失败: %v", err) } defer dataResp.Body.Close() // 读取响应 respBody, err := ioutil.ReadAll(dataResp.Body) if err != nil { log.Fatalf("读取响应失败: %v", err) } log.Printf("响应状态码: %d", dataResp.StatusCode) log.Printf("响应内容: %s", string(respBody)) }
常见调整点
- 如果登录接口是用
x-www-form-urlencoded格式提交参数,把登录请求的body构造部分替换为以下代码即可:
loginParams := url.Values{} loginParams.Set("username", "你的账号") loginParams.Set("password", "你的密码") loginReq, err := http.NewRequest("POST", loginUrl, bytes.NewBufferString(loginParams.Encode())) loginReq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
- 如果加Authorization头还是返回未登录,直接用浏览器F12抓登录后调用GET接口的请求头,把对应的认证字段名替换到代码里即可。
内容的提问来源于stack exchange,提问作者Nicolas Eduardo Garcia Santeli
相关产品推荐
相关产品推荐

