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
相关产品推荐
相关产品推荐

