Coo*_*per 5 encoding json webhooks
New Relic 当前 URL 对我们的 webhooks 的 JSON 负载进行编码。我们正确地包含了必要的标头,但是,我想知道这是否是最佳实践 - 或者是否应该以未编码的方式发送 JSON 有效负载(或者甚至使用一些不同的编码)?

更常见的做法是直接在请求正文中发送Content-Type标头值为 的JSON application/json。然而,像 New Relic 那样做的情况并不少见。GitHub post-receive hook 有效负载也以这种方式编码。
在某些语言/框架中,从参数中提取 JSON 数据比读取整个请求正文更容易,因为表单参数会自动解析并轻松引用,并且在某些情况下读取请求正文可能涉及一些更复杂的流解析。
一个示例是用于提取整个原始请求正文的 PHP 语法:
$data = file_get_contents('php://input');
var_dump(json_decode($data));
Run Code Online (Sandbox Code Playgroud)
与从表单参数中提取:
$data = $_POST["payload"];
var_dump(json_decode($data));
Run Code Online (Sandbox Code Playgroud)
对于轻松公开请求主体的框架来说,这并不是什么大问题。以下是 GitHub 文档中给出的用于使用 Sinatra 处理钩子的示例:
post '/' do
push = JSON.parse(params[:payload])
"I got some JSON: #{push.inspect}"
end
Run Code Online (Sandbox Code Playgroud)
如果直接传递 JSON 主体,则如下所示:
post '/' do
push = JSON.parse(request.body.read)
"I got some JSON: #{push.inspect}"
end
Run Code Online (Sandbox Code Playgroud)
这主要只是一种审美偏好,没有任何技术优势。通过该参数,您可以灵活地在单个请求中发送多个 JSON 有效负载,或者可以选择在 JSON 之外发送其他元数据。如果这对您很重要,我建议发送 JSON 对象列表并将所有元数据包含在顶级包装器中。像这样的东西:
{
"notification_id": "akjfd8",
"events": [ ... ]
}
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢原始 JSON 主体,但这主要是因为它使在 RequestBin 等网站上的调试变得更加容易。您的屏幕截图很好地说明了编码到表单参数中的 JSON 是多么不可读。
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |