Go中设置从客户端API获取的请求头时出现报错问题排查
问题排查与解决方案
1. 校验Authorization头格式
Bearer令牌的标准格式为 Bearer <令牌内容>,你从ctx.Get("Authorization")获取的可能仅为纯令牌字符串,缺少Bearer 前缀。修改代码补充前缀:
tokenRaw := ctx.Get("Authorization") tokenBarear, ok := tokenRaw.(string) if !ok { fmt.Println("令牌类型错误,非字符串格式") return nil, fmt.Errorf("无效令牌类型") } // 拼接标准Bearer格式 authHeader := fmt.Sprintf("Bearer %s", tokenBarear) req.Header.Set("Authorization", authHeader)
如果ctx中存储的Authorization已包含Bearer 前缀,可跳过拼接步骤,但建议打印完整字符串确认格式。
2. 修正Content-Type设置逻辑
使用Set替代Add,避免重复添加Content-Type头导致服务端解析异常:
req.Header.Set("Content-Type", "application/json")
3. 完善响应状态码与错误处理
当前代码未检查HTTP响应状态码,无法直观判断是授权失败还是其他请求问题。补充状态码检查与错误响应读取:
res, err := client.Do(req) if err != nil { fmt.Println("请求发送失败:", err) return nil, err } defer res.Body.Close() // 提前defer,避免资源泄漏 // 检查响应状态码 if res.StatusCode < 200 || res.StatusCode >= 300 { bodyBytes, _ := io.ReadAll(res.Body) fmt.Printf("请求失败,状态码: %d,响应内容: %s\n", res.StatusCode, string(bodyBytes)) return nil, fmt.Errorf("请求失败,状态码: %d", res.StatusCode) } // 解码响应内容 cashinResponse := &response.CashinResponse{} err = json.NewDecoder(res.Body).Decode(&cashinResponse) if err != nil { fmt.Println("响应解码失败:", err) return nil, err }
4. 确认ctx返回值类型合法性
ctx.Get返回interface{}类型,需确保其为字符串类型,避免隐式类型转换错误:
tokenRaw := ctx.Get("Authorization") tokenBarear, ok := tokenRaw.(string) if !ok { fmt.Println("令牌类型错误,无法转换为字符串") return nil, fmt.Errorf("无效令牌类型") }
额外排查建议
- Postman测试时,确保Authorization头格式与代码打印的令牌完全一致(含大小写、特殊字符);
- 验证令牌实际有效期,排除打印时显示正确但已过期的情况。
内容的提问来源于stack exchange,提问作者loops
相关产品推荐
相关产品推荐

