本文探討go語言中處理HTTP請求返回的Unicode編碼中文字符的問題,并提供改進后的代碼。
問題描述: Go語言HTTP請求有時會返回Unicode編碼的中文字符(例如 u5f20u4e09),需要將其轉換為可讀的中文。原代碼嘗試使用utf8.fullrune,但該函數并非用于Unicode轉碼。
改進方案: 直接使用Go語言的encoding/json包進行解碼,這是處理JSON響應中Unicode字符的最佳方法。 encoding/json包能夠自動處理Unicode轉碼。無需額外引入golang.org/x/text包。
立即學習“go語言免費學習筆記(深入)”;
改進后的代碼:
package main import ( "bytes" "encoding/json" "fmt" "io" "net/http" "net/url" ) type ResponseData struct { // 定義一個結構體來匹配返回的JSON數據結構,根據實際情況調整字段 PersonName string `json:"personname"` Age int `json:"age"` High int `json:"high"` Sex string `json:"sex"` Class struct { ClassName string `json:"classname"` Grade int `json:"grade"` Tt struct { A string `json:"a"` } `json:"tt"` } `json:"class"` Message string `json:"message"` } func post(requrl string, headers map[string]string, reqproxy string) (string, error) { var client http.Client if reqproxy != "" { proxy, err := url.Parse(reqproxy) if err != nil { return "parse req_proxy fail", err } client.Transport = &http.Transport{ Proxy: http.ProxyURL(proxy), } } data := []byte(`{"personname":"張三","age":18,"high":182,"sex":"男","class":{"classname":"1班","grade":3,"tt":{"a":"b"}},"message":"測試成功!"}`) req, err := http.NewRequest("POST", requrl, bytes.NewReader(data)) if err != nil { return "", err } for key, value := range headers { req.Header.Set(key, value) } resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() // 重要:關閉響應體 body, err := io.ReadAll(resp.Body) if err != nil { return "", err } var responseData ResponseData err = json.Unmarshal(body, &responseData) if err != nil { return "", fmt.Errorf("JSON unmarshal error: %w", err) } return fmt.Sprintf("%+v", responseData), nil // 使用%+v打印結構體所有字段 } func main() { headers := map[string]string{ "User-Agent": "test", "Content-Type": "application/json", // 重要:設置Content-Type } content, err := post("http://httpbin.org/post", headers, "") if err != nil { fmt.Println("Error:", err) } else { fmt.Println(content) } }
改進說明:
- 使用encoding/json: 代碼直接使用json.Unmarshal函數將JSON響應解碼到一個Go結構體(ResponseData)中。這避免了手動處理Unicode編碼的復雜性。 結構體定義需要根據實際返回的JSON數據結構進行調整。
- 錯誤處理: 添加了更全面的錯誤處理,包括json.Unmarshal的錯誤。
- http.Client 使用: 正確地使用了 http.Client,并設置了超時時間。
- resp.Body.Close(): 添加了 defer resp.Body.Close() 來確保響應體被正確關閉,釋放資源。
- Content-Type Header: 添加了 Content-Type: application/json 到請求頭中,確保服務器正確解析請求體。
- %+v for printing: 使用 %+v 來打印結構體,以便清晰地查看所有字段的值。
這個改進后的代碼更加簡潔、高效,并且能夠可靠地處理HTTP請求返回的Unicode編碼中文字符。 它充分利用了Go語言內置的json處理能力,避免了不必要的依賴和潛在的編碼問題。 記住根據你的實際API返回的JSON結構調整ResponseData結構體。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END