Error #01: invalid character ‘x1f‘ looking for beginning of value

it2025-08-17  8

package server import ( "bytes" "compress/gzip" "encoding/json" "fmt" "io" "io/ioutil" "net/http" "strconv" "strings" "time" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "next-stage.com.cn/mercury-backend/api" "next-stage.com.cn/mercury-backend/service" ) type bodyWriter struct { gin.ResponseWriter bodyBuf *bytes.Buffer } func (w bodyWriter) Write(b []byte) (int, error) { //memory copy here! w.bodyBuf.Write(b) return w.ResponseWriter.Write(b) } //gin 拦截器 拦截1v1比对接口 //UploadVerifyLog ... 1V1日志上传 func UploadVerifyLog() gin.HandlerFunc { return func(c *gin.Context) { if c.FullPath() == "/v2/faces/compare" { var requestBodyBytes []byte if c.Request.Body != nil { requestBodyBytes, _ = ioutil.ReadAll(c.Request.Body) } c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(requestBodyBytes)) var responseBodyWriter bodyWriter //response写缓存 responseBodyWriter = bodyWriter{bodyBuf: bytes.NewBufferString(""), ResponseWriter: c.Writer} c.Writer = responseBodyWriter c.Next() sourceInfo := string(requestBodyBytes) var request api.CompareRequest err := json.Unmarshal(requestBodyBytes, &request) if err != nil { c.Error(err.(error)) // nolint: errcheck c.Abort() return } var response api.CompareResponse //拦截的http请求由于压缩过,因此需要解压,再进行解析 //response header Content-Encoding →gzip reader, err := gzip.NewReader(responseBodyWriter.bodyBuf) if err != nil { c.Error(err.(error)) // nolint: errcheck c.Abort() return } dec := json.NewDecoder(reader) err = dec.Decode(&response) if err != nil && err != io.EOF { c.Error(err.(error)) // nolint: errcheck c.Abort() return } //检索日志写数据库逻辑 similarity, err := strconv.ParseFloat(response.Data, 64) if err != nil { similarity = 0 } responseBody := strings.Trim(responseBodyWriter.bodyBuf.String(), "\n") _, err = service.CreateRetrievalLog(c, &api.CreateRetrievalLogRequest{ Operation: c.Request.Method, Component: c.FullPath(), SourceInfo: &sourceInfo, SinkInfo: &responseBody, CompareType: 0, IDNumber: request.IDCard, CapturedFaceImage: &api.Image{Base64: request.ImageOneBase64}, HitFaceImage: &api.Image{Base64: request.ImageTwoBase64}, Similarity: similarity, }) if err != nil { c.Error(err.(error)) // nolint: errcheck c.Abort() return } c.Next() } } }

var response api.CompareResponse

err = json.Unmarshal(responseBodyWriter.bodyBuf.Bytes(), &response)

原本是直接把responsebody解析为json,一直报这个Error #01: invalid character '\x1f' looking for beginning of value错误,解析出来的结果是乱码的。

刚开始想到的是,编码格式不一致导致的。后来发现,response header Content-Encoding →gzip,因此需要先使用compress/gzip对其进行解码。

最新回复(0)