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对其进行解码。