webhook JSON有效负载应该是URL编码的吗?

时间:2013-12-12 23:01:43

标签: json encoding webhooks

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

enter image description here

2 个答案:

答案 0 :(得分:3)

Content-Type标头值为application/json的请求正文中直接发送JSON更为常见。然而,按照New Relic的方式这样做并不是完全不常见的。 GitHub后接收挂钩有效负载也以这种方式编码。

在某些语言/框架中,从参数中提取JSON数据比从读取整个请求主体更容易,因为表单参数会自动解析并轻松引用,在某些情况下,读取请求主体可能需要更精细的流解析。

这方面的一个例子是PHP用于提取整个原始请求主体的语法:

$data = file_get_contents('php://input');
var_dump(json_decode($data));

从表单参数中提取:

$data = $_POST["payload"];
var_dump(json_decode($data));

对于容易公开请求正文的框架,这不是一个问题。以下是GitHub文档中用于处理Sinatra钩子的示例:

post '/' do
  push = JSON.parse(params[:payload])
  "I got some JSON: #{push.inspect}"
end

如果直接传递了JSON主体,那就是它的样子:

post '/' do
  push = JSON.parse(request.body.read)
  "I got some JSON: #{push.inspect}"
end

这主要只是一种审美偏好,两者都没有技术优势。使用该参数,您可以灵活地在单个请求中发送多个JSON有效负载,或者选择在JSON之外发送其他元数据。我建议发送一个JSON对象列表,并将所有元数据包含在顶级包装中,如果这对您很重要的话。像这样:

{
    "notification_id": "akjfd8",
    "events": [ ... ]
}

我个人更喜欢原始JSON主体,但这主要是因为它使得在RequestBin等网站上调试变得更加容易。您的屏幕截图可以很好地说明如何将不可读的JSON编码到表单参数中。

答案 1 :(得分:1)

<rant>

有效负载应该是您说的内容类型。如果他们以application/x-www-form-urlencoded发送,那么您应该期望找到它。在我看来,使用嵌套编码的俄罗斯娃娃模型的文化是愚蠢的。

如果您想发送JSON,请将其发送为application/json。这真的很难吗?

</rant>