我是Go的新手,但到目前为止,我非常喜欢它。
我有一个我不知道的问题。我正在将API从Node迁移到Go,并且有此日志必须捕获POST 原样
并将其保存到jsonb
Postgresql数据库的type列中。
这意味着我不能使用struct
或预定的任何东西。
POST是用body raw制作的,Content-Type: application/json
如下所示:
{
"debug": false,
"order_id_gea": 326064,
"increment_id_gea": 200436102,
"date": "2017-05-18T01:44:44+00:00",
"total_amount": 10000.00,
"currency": "MXN",
"payment_method": "Referencia bancaria",
"reference": "857374",
"buyer": {
"buyer_id_gea": 1234,
"full_name": "Juan Perez Martinez",
"email": "juanperez@gmail.com",
"phone": "5512341234"
},
"products": [
{
"sku":"PEP16114",
"price": 10000.00,
"currency": "MXN",
"student": {
"school_id_gea": 172,
"grade_id_gea": 119,
"level_id_gea": 36,
"name": "Benancio",
"last_name": "Perez",
"second_last_name": "Garcia",
"email": "benancio@gmail.com"
}
}
]
}
在Node + Hapi上非常简单:
const payload = request.payload
然后我可以从访问JSON payload
。
我正在将Go与Echo一起使用,所以context
可以在其中找到一个包装器Request() *http.Request
。
我已经尝试了以下方法,但是每次结果为空或由于为空而出错:
var v interface{}
err := json.NewDecoder(context.Request().Body).Decode(&v)
if err != nil {
return result, err
}
fmt.Println(v)
结果:EOF
--
m := echo.Map{}
if err := context.Bind(&m); err != nil {
return result, err
}
fmt.Println(m)
结果代码400,消息EOF
--
body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {
return result, error
}
fmt.Println(body)
结果[]
--
我缺少什么和/或做错了什么?谢谢!
TIL http.Response.Body
是一个缓冲区,这意味着一旦读取它,就不能再次读取它。
就像水流一样,您可以看到它并在流过时对其进行测量,但是一旦流失,它就消失了。
但是,知道这一点,有一种解决方法,您需要“捕获”主体并将其还原:
// Read the Body content
var bodyBytes []byte
if context.Request().Body != nil {
bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}
// Restore the io.ReadCloser to its original state
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// Continue to use the Body, like Binding it to a struct:
order := new(models.GeaOrder)
error := context.Bind(order)
现在,您可以在context.Request().Body
其他地方使用。
资料来源:
http://grokbase.com/t/gg/golang-nuts/12adq8a2ys/go-nuts-re-reading-http-
response-body-or-any-reader
https://medium.com/@xoen/golang-read-from-an-io-readwriter-without-loosing-
its-content-2c6911805361
如何将转换为请求正文的表示形式?或者,如何正确地记录整个请求/响应,同时能够在其中散列潜在的凭据?
我有以下问题:我试图在Spring控制器处理POST请求之前获取它的主体。为此,我使用HandlerInterceptorAdapter的preHandle()方法。 如本讨论中所述 SpringREST服务:从请求中检索JSON 我也使用使用此包装器,我设法打印了第一个POST请求的正文,但第二个POST抛出一个IOException:流关闭。 您对如何获取所有POST请求的正文有什么想法吗?
如何获取json请求正文?
我正在使用AWS SAM(Lambda 第三方调用我的API,并在正文中包含JSON的GET请求。但是,当请求发送到带有正文的API时,CloudTop会拒绝该请求。 请求如下: 以下是回应: 检查日志时,请求永远不会命中API网关或Lambda函数。但是,如果我从请求中删除正文,那么它将命中Lambda函数,并且我将从API中获得适当的错误消息(告诉调用方预期的正文丢失)。 我通过SAM模板使用
当我向我的Twilio号码发送特定的消息时,我希望根据该消息采取行动。问题是,返回的是整个请求,而不是正文。 我在这里遵循了Twilio指南来创建webhook:https://www.Twilio.com/docs/sms/tutorials/how-to-receive-and-reply-java,并对其进行了修改,以查看请求主体,将其与我要查找的内容进行比较,然后根据需要做出响应。 问题正
我有一个用@ControllerAdvice注释的类和用@ExceptionHandler注释的方法来处理服务代码引发的异常。在处理这些异常时,我希望获得@RequestBody,它是请求POST操作的一部分。 我尝试为发送的请求创建POJO类,并尝试在异常处理程序类中检索,但它返回null。 遵循本查询中给出的相同解决方案~如何在@ExceptionHandler(Spring REST)中获取