Golang如何返回带正确换行、无多余引号的原始HTTP响应
问题根因
返回结果不符合预期的核心问题是误用JSON编码器输出纯文本内容:json.NewEncoder(w).Encode(string(b)) 会严格遵循JSON序列化规则处理输入字符串:自动给字符串两端包裹双引号,同时把换行符等特殊字符转义为\n形式的字面转义序列,这是JSON格式的标准行为,根本不适用于「原样返回请求体」的场景。
正确实现
你已经通过ReadAll拿到了请求体的原始字节,不需要做任何编码转换,直接把原始字节写入响应即可,同时补上缺失的请求体关闭逻辑、错误提前返回逻辑:
func Handler(w http.ResponseWriter, r *http.Request) { // 注意:Go 1.16+ 版本推荐使用 io.ReadAll 替代 ioutil.ReadAll,功能完全一致 b, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, "failed to read request body", http.StatusBadRequest) return } defer r.Body.Close() // 及时关闭请求体,避免资源泄漏 w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) w.Write(b) // 直接写入原始字节,实现原样返回 }
验证结果
替换上述实现后再运行测试,位置(2)打印的响应内容会和位置(1)的控制台输出完全一致:
a b c
完全满足需求:
- 响应内容无多余的包裹双引号
- 保留真实换行效果,不会出现转义后的字面量
\n
内容的提问来源于stack exchange,提问作者JS_Kim
相关产品推荐
相关产品推荐

