Golang如何发送包含"<p> He is 😀</p>"的POST请求
Golang如何发送包含"
He is 😀
"的POST请求 当我发送请求时,表情符号变成了乱码。 我认为对其进行编码可以解决这个问题。例如,这个 He is \uD83D\uDE00</p>
将会起作用。
有人知道如何编码这个吗?或者如果你知道其他方法可以让它正常工作?
提前感谢
这是负载内容:
{ "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))
}
关键点:
- 确保设置正确的Content-Type头部,特别是
charset=utf-8 - 使用原始字符串字面量(反引号)可以避免转义问题
- Go的
json.Marshal会自动处理Unicode字符编码 - 如果使用表单数据,
url.Values的Encode()方法会正确处理特殊字符
这些方法中,方法3(使用结构体自动编码)是最简洁和推荐的方式,因为Go的JSON编码器会自动处理所有Unicode字符,包括表情符号。

