golang:如何删除请求正文中的空格和换行符

a64a0gku  于 2023-06-27  发布在  Go
关注(0)|答案(3)|浏览(225)

我编写了一个web服务(golang),使用gin框架接收JSON主体格式的参数。我提出这样的请求:

curl --location 'http://foo.bar/test' \
--header 'Content-Type: application/json' \
--data'{
     "a": "1",
     "b": "2"
}'

现在,我添加了一个中间件,它将所有请求参数打印到一个日志文件中,该文件在控制器上面一层运行。注意,在中间件层不知道参数的具体类型。当我读取body并打印日志时,我得到以下结果:

[2023/06/20 11:44:38 CST] [INFO] (.../infra/log.Info:18) request_in||traceid=xx||spanid=xxx||path=/test||body= {
     "a": "1",
     "b": "2"
}

我期待的是这样的:

[2023/06/20 11:44:38 CST] [INFO] (/infra/log.Info:18) request_in||traceid=xx||spanid=xxx||path=/test||body={"a ":"1","b":"2"}

请问:如何删除正文中的空格和换行符?注意,本例中的body参数相对简单,但实际情况会更复杂。谢谢

8iwquhpp

8iwquhpp1#

您可以使用以下方法替换正文中的空格和换行符。

使用字符串。ReplaceAll()

requestBodyBytes, err := c.GetRawData()
if err != nil {
  // Handle this
}

body := string(requestBodyBytes)
body = strings.ReplaceAll(body, "\n", "")
body = strings.ReplaceAll(body, " ", "")

fmt.Printf("body=%v \n", body)

当您需要通过在将请求传递到控制器之前删除空格和行来更改请求正文时,可以使用此方法。

使用编组

requestBodyBytes, err := c.GetRawData()
if err != nil {
  // Handle this
}

var data interface{}
json.Unmarshal(requestBodyBytes, &data)

marshalledBytes, err := json.Marshal(data)
if err != nil {
  // Handle this
}
fmt.Printf("body=%v \n", string(marshalledBytes))

当您只需要删除空格和行以进行日志记录时,请使用此。

dnph8jn4

dnph8jn42#

您可以像这样删除空格和换行符:

package main

import (
    "fmt"
)

func main() {
    data := []byte(`{
     "a": "1",
     "b": "2"
}`)

    i := 0
    for _, b := range data {
        switch b {
        case ' ', '\n', '\r':
        default:
            data[i] = b
            i++
        }
    }
    data = data[:i]

    fmt.Printf("%s\n", data)
}

备注

1.它重用当前切片的空间。
1.不要像这样记录请求正文。理由:
1.日志记录的目的是查看从客户端发送的确切内容。如果内容被修改,它就不再可信。
1.在中间件中阅读请求体将影响随后执行的处理程序。因为主体已经被读取,所以后续的读取在大多数情况下将获得EOF。当然,你可以把body存储在其他地方,然后把它传递给其他处理程序,但这是浪费内存。

mwecs4sa

mwecs4sa3#

// Remove new line, tab, and space characters from a string
body = strings.ReplaceAll(body, "\n", "")
body = strings.ReplaceAll(body, " ", "")
body = strings.ReplaceAll(body, "\t", "")

相关问题