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

Go语言中拼接字符串指针生成POST请求Payload的转义问题

你的问题出在手动拼接JSON字符串的方式完全错误——Go里没法直接在双引号包裹的字符串里插入指针变量,而且你的转义写法也不符合语法规范,才会报「未知转义」错误。下面给两种正确的实现方式:

方法一:用fmt.Sprintf拼接合法JSON字符串

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func GetJWT(userEmail, userToken *string) string {
    endpoint := "https://api.io/v1/oauth/token"
    
    // 解引用指针拿到实际字符串,拼接成userToken格式
    combinedToken := fmt.Sprintf("%s:%s", *userEmail, *userToken)
    // 用反引号包裹JSON模板,通过占位符插入变量,避免双引号转义麻烦
    payloadStr := fmt.Sprintf(`{"userToken":"%s"}`, combinedToken)
    payload := strings.NewReader(payloadStr)

    req, err := http.NewRequest("POST", endpoint, payload)
    if err != nil {
        // 实际项目中需根据业务处理错误,这里示例返回空字符串
        return ""
    }

    req.Header.Add("Accept", "application/json")
    req.Header.Add("Content-Type", "application/json")

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        return ""
    }
    defer res.Body.Close()
    
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return ""
    }

    return string(body)
}

方法二:用结构体序列化JSON(更推荐)

手动拼接JSON容易出现格式错误,用标准库序列化结构体是更稳妥的方式:

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func GetJWT(userEmail, userToken *string) string {
    endpoint := "https://api.io/v1/oauth/token"
    
    // 定义与接口要求匹配的结构体
    type RequestPayload struct {
        UserToken string `json:"userToken"`
    }
    
    // 构造结构体实例,解引用指针拼接参数
    payloadData := RequestPayload{
        UserToken: fmt.Sprintf("%s:%s", *userEmail, *userToken),
    }
    
    // 序列化结构体为JSON字节数组,标准库自动处理格式和转义
    payloadBytes, err := json.Marshal(payloadData)
    if err != nil {
        return ""
    }
    payload := strings.NewReader(string(payloadBytes))

    req, err := http.NewRequest("POST", endpoint, payload)
    if err != nil {
        return ""
    }

    req.Header.Add("Accept", "application/json")
    req.Header.Add("Content-Type", "application/json")

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        return ""
    }
    defer res.Body.Close()
    
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return ""
    }

    return string(body)
}

注意:你原代码完全忽略了错误处理,实际开发中必须处理http.NewRequest、Do、ReadAll等方法返回的错误,避免隐藏潜在问题。

内容的提问来源于stack exchange,提问作者Saurabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:31:02