如何 "see" json 来自 POST 请求的响应(webhook)
How to "see" json response from POST request (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 时的响应有很大不同。
我的问题是:在使用 Google 助手时,我如何 "see" 将什么 JSON 发送到我的 PHP 脚本?换句话说,我怎样才能一次 "see" 整个 $requestBody
变量?
例如,我尝试使用https://webhook.site/,我填写了以下信息来创建新的URL/endpoint:
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 错误日志以查看发送的内容。 (正如您在评论中指出的那样,您可以在项目目录的终端中使用 heroku 上的 heroku logs
来执行此操作。)
如果您希望将它发送到其他位置,您可以查看 error_log() 的文档以了解有关如何将其发送到电子邮件地址(如果您的配置支持)或另一个文件的详细信息。例如,这会将内容记录到名为 /tmp/json.txt
:
的文件中
error_log( json_encode( $json, JSON_PRETTY_PRINT ), 3, "/tmp/json.txt" );
更复杂的解决方案:使用代理
您也可以使用 ngrok 等允许请求检查的代理。这将为您提供一个 public 主机名,您可以将其设置为转发到您的服务所在的主机名 运行。然后,您可以将此 public 主机名用于 Dialogflow 中的实现 URL 以及 webhook 的路径。当 Dialogflow 发送请求时,它将转到此代理,代理会将其转发给您的服务。您的服务回复代理,代理将其转发回 Dialogflow。您可以同时检查请求和响应。 (ngrok 与服务在同一台机器上运行,并允许通过另一个 URL 进行检查,您可以使用它来查看请求和响应。其他代理的工作方式可能不同。webhook.site 看起来像做类似的事情,但是我还没有测试它的代理是如何工作的。)
我在 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 时的响应有很大不同。
我的问题是:在使用 Google 助手时,我如何 "see" 将什么 JSON 发送到我的 PHP 脚本?换句话说,我怎样才能一次 "see" 整个 $requestBody
变量?
例如,我尝试使用https://webhook.site/,我填写了以下信息来创建新的URL/endpoint:
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 错误日志以查看发送的内容。 (正如您在评论中指出的那样,您可以在项目目录的终端中使用 heroku 上的 heroku logs
来执行此操作。)
如果您希望将它发送到其他位置,您可以查看 error_log() 的文档以了解有关如何将其发送到电子邮件地址(如果您的配置支持)或另一个文件的详细信息。例如,这会将内容记录到名为 /tmp/json.txt
:
error_log( json_encode( $json, JSON_PRETTY_PRINT ), 3, "/tmp/json.txt" );
更复杂的解决方案:使用代理
您也可以使用 ngrok 等允许请求检查的代理。这将为您提供一个 public 主机名,您可以将其设置为转发到您的服务所在的主机名 运行。然后,您可以将此 public 主机名用于 Dialogflow 中的实现 URL 以及 webhook 的路径。当 Dialogflow 发送请求时,它将转到此代理,代理会将其转发给您的服务。您的服务回复代理,代理将其转发回 Dialogflow。您可以同时检查请求和响应。 (ngrok 与服务在同一台机器上运行,并允许通过另一个 URL 进行检查,您可以使用它来查看请求和响应。其他代理的工作方式可能不同。webhook.site 看起来像做类似的事情,但是我还没有测试它的代理是如何工作的。)