如何"查看"来自 POST 请求的 json 响应(webhook)



我在Dialogflow中创建了一个聊天机器人,它通知用户我的(扩展)家庭成员以及他们住在哪里。我用MySQL创建了一个小型数据库,其中存储了这些数据,并且我使用PHP脚本(托管在Heroku上)获取它们,具体取决于用户与聊天机器人的交互。 我的PHP脚本从Dialogflow接收POST请求(webhook)如下:

<?php
$dbServername = '******************';
$dbUsername = '******************';
$dbPassword = '******************';
$dbName = '******************';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
header('Content-Type: application/json');
$method = $_SERVER['REQUEST_METHOD'];
if($method == 'POST'){
$requestBody = file_get_contents('php://input');
$json = json_decode($requestBody);
$action = $json->result->action;
$first_name = $json->result->contexts[0]->parameters->{'given-name'};
$last_name = $json->result->contexts[0]->parameters->{'last-name'};
$lifespan = $json->result->contexts[0]->lifespan;
$sql = "SELECT * FROM family WHERE name LIKE '%$first_name%$last_name%';";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$person = $row;
}
switch ($action) {
case 'Name':
$speech= "$first_name is my" . $person["name"] . ".";
break;  
case 'Location':
$speech = "$first_name is living in {$person["location"]}.";
break;
default:
$speech = "Please ask me something more relevant to my family";
break;
} 
}
else {
$speech = "Sorry, $first_name $last_name is not a member of my family.";
}
$response = new stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "agent";
echo json_encode($response);
}
else
{
echo "Method not allowed";
}
?>

我可以立即在 Dialogflow 上看到我在 PHP 脚本中从它收到的 json 响应。但是,Google 助理不提供此选项。问题还在于,使用Google Assistant时的json响应与仅使用Dialogflow时的json响应有很大不同。

我的问题是:在使用 Google Assistant 时,我如何"看到"发送到我的 PHP 脚本的 JSON 是什么?换句话说,我怎样才能一次"看到"整个变量$requestBody

例如,我尝试使用 https://webhook.site/并填写以下信息来创建新的 URL/端点:

Default status code ->  200
Content Type -> application/json
Timeout before response -> 0
Response body -> {
"speech": "WEBHOOK",
"displayText": "WEBHOOK",
"source": "agent"
}

响应正文的结构与我的 PHP 脚本中的结构相同。但是,由于某种原因,Google Assistant 不会从此自定义端点接收 json 响应(而 Dialogflow 确实完美地接收了它)。因此,我无法完全继续前进,看看它是由Dialogflow和Google Assistant发送的,在意图进一步由上下文触发的情况下......

简单的解决方案:添加日志记录

在代码中添加一些错误日志记录,以打印出格式化的 JSON。创建$json后立即将其记录到普通 HTTP 日志文件中:

error_log( json_encode( $json, JSON_PRETTY_PRINT ) );

然后,您可以在每个请求后检查HTTP错误日志,以查看发送的内容。 (正如您在评论中指出的那样,您可以使用项目目录中终端中的herokuheroku logs来执行此操作。

如果您希望将其发送到其他位置,可以查看 error_log() 的文档,了解有关如何将其发送到电子邮件地址(如果您的配置支持)或其他文件的详细信息。例如,这会将内容记录到名为/tmp/json.txt的文件中:

error_log( json_encode( $json, JSON_PRETTY_PRINT ), 3, "/tmp/json.txt" );

更复杂的解决方案:使用代理

您还可以使用允许请求检查的代理(如 ngrok)。这将为您提供一个公共主机名,您将将其设置为转发到运行服务的主机名。然后,您可以将此公共主机名用于对话流中的履行 URL 和 webhook 的路径。当对话流发送请求时,它将转到此代理,该代理会将其转发到您的服务。您的服务回复代理,代理将其转发回对话流。您可以检查请求和响应。(ngrok 与服务在同一台计算机上运行,并允许通过另一个 URL 来查看请求和响应。其他代理的工作方式可能不同。webhook.site 看起来它做了类似的事情,但我还没有测试它的代理是如何工作的。

最新更新