Golang如何发送包含"<p> He is 😀</p>"的POST请求

Golang如何发送包含"

He is 😀

"的POST请求 当我发送请求时,表情符号变成了乱码。 我认为对其进行编码可以解决这个问题。例如,这个

 He is \uD83D\uDE00</p>

将会起作用。

有人知道如何编码这个吗?或者如果你知道其他方法可以让它正常工作?

提前感谢

9 回复

这是负载内容:

{ "string": "<p>Barry 😀</p>"}

更多关于Golang如何发送包含"<p> He is 😀</p>"的POST请求的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你发布的代码片段中没有包含表情符号。payload 具体是什么?

// 代码示例
func example() {
    // 代码内容
}

请向我们展示发出此请求的确切客户端代码。

你如何知道你的代码不起作用?你期望什么?

不是那个有效载荷,而是这一行中 payload确切内容

payloadB, err := json.Marshal(payload)

如果你不提供理解和重现问题所必需的信息,我们很难帮助你。

当我向我的端点发送请求时,我处理该请求并将其渲染到HTML页面上。 而渲染结果看起来像这样 <p>Barry 😀</p>,所以甚至连 p 标签都没有按应有的方式渲染。

这是数据。抱歉延迟了,并且之前没有提供。

type Data struct {
    TextData    string `json:"text"`
}
s := "{<p>Barry 😀 🍇</p>}"
payload := TextData{
TextData: s
}
payloadB, err := json.Marshal(payload)
payloadB, err := json.Marshal(payload)
if err != nil {
    return nil, err
}

req, err := http.NewRequest("POST", uri, bytes.NewReader(payloadB))
req.SetBasicAuth(username, password)
req.Header.Set("Content-Type", "application/json")

我希望收到的是表情符号,而不是这个 😀

到目前为止,我无法复现您的问题。请参考这个示例:https://play.golang.org/p/G59ENK7WxhV

使用 json.Marshal 的结果作为输入调用 json.Unmarshal 会返回预期的 TextData。表情符号显示正常。

因此,请展示您对编码后的 payloadB 具体执行了哪些操作。您是如何发送它的?您如何知道接收它的服务器收到了乱码?

在Go中发送包含特殊字符和表情符号的POST请求时,需要使用正确的编码方式。表情符号变成乱码通常是因为编码问题。以下是几种解决方案:

方法1:使用原始字符串字面量(推荐)

package main

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

func main() {
    // 使用原始字符串字面量,避免转义问题
    jsonStr := `{"content": "<p>He is 😀</p>"}`
    
    req, err := http.NewRequest("POST", "https://api.example.com/endpoint", 
        bytes.NewBuffer([]byte(jsonStr)))
    if err != nil {
        panic(err)
    }
    
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

方法2:使用Unicode转义序列

package main

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

func main() {
    // 使用Unicode转义序列
    jsonStr := `{"content": "<p>He is \uD83D\uDE00</p>"}`
    
    req, err := http.NewRequest("POST", "https://api.example.com/endpoint", 
        bytes.NewBuffer([]byte(jsonStr)))
    if err != nil {
        panic(err)
    }
    
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

方法3:使用结构体自动编码

package main

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

type RequestBody struct {
    Content string `json:"content"`
}

func main() {
    // 直接使用表情符号,Go会自动处理编码
    body := RequestBody{
        Content: "<p>He is 😀</p>",
    }
    
    jsonData, err := json.Marshal(body)
    if err != nil {
        panic(err)
    }
    
    req, err := http.NewRequest("POST", "https://api.example.com/endpoint", 
        bytes.NewBuffer(jsonData))
    if err != nil {
        panic(err)
    }
    
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    responseBody, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(responseBody))
}

方法4:使用url.Values处理表单数据

如果是发送表单数据而不是JSON:

package main

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

func main() {
    data := url.Values{}
    data.Set("content", "<p>He is 😀</p>")
    
    req, err := http.NewRequest("POST", "https://api.example.com/endpoint", 
        strings.NewReader(data.Encode()))
    if err != nil {
        panic(err)
    }
    
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

关键点:

  1. 确保设置正确的Content-Type头部,特别是charset=utf-8
  2. 使用原始字符串字面量(反引号)可以避免转义问题
  3. Go的json.Marshal会自动处理Unicode字符编码
  4. 如果使用表单数据,url.ValuesEncode()方法会正确处理特殊字符

这些方法中,方法3(使用结构体自动编码)是最简洁和推荐的方式,因为Go的JSON编码器会自动处理所有Unicode字符,包括表情符号。

回到顶部