You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:15:05