如何 "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 看起来像做类似的事情,但是我还没有测试它的代理是如何工作的。)