如何从POST请求“看到”json响应(webhook)

时间:2018-04-05 10:12:11

标签: php json webhooks actions-on-google dialogflow

我在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智能助理时的json响应与仅使用Dialogflow时的响应有很大不同。

我的问题是:在使用Google智能助理时,如何“查看”将JSON发送到我的PHP脚本?换句话说,我怎么能一次“看到”整个$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智能助理不会从此自定义端点收到json响应(而Dialogflow确实会收到它完美)。因此,我无法继续前进,看看它是由Dialogflow&amp;对于意图的情况,Google智能助理会被上下文进一步触发......

1 个答案:

答案 0 :(得分:0)

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

在代码中添加一些错误记录,打印出格式化的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等代理。这将为您提供一个公共主机名,您将设置该主机名转发到运行服务的主机名。然后,您可以将此公共主机名用于Dialogflow中的实现URL以及webhook的路径。当Dialogflow发送请求时,它将转到此代理,该代理会将其转发给您的服务。您的服务回复代理,代理将其转发回Dialogflow。您可以检查请求和响应。 (ngrok在与服务相同的机器上运行,并允许通过使用另一个可以查看请求和响应的URL进行检查。其他代理可能会有不同的工作.webhook.site看起来像它做了类似的事情,但我还没有测试了它的代理如何工作。)