我正在使用PHP与XAMPP和Dialogflow来创建聊天界面。在Dialogflow中的一个简单的意图(问题)中,我为XAMPP创建了一个关于“谁是X”的问题的webhook(例如Paul,George)。因此,我发出了一个POST REQUEST,以便在DIalogflow中访问此问题的json形式,以便我可以按照自己的意愿回答。具体来说,最终目标是从phpMyAdmin中的MySQL数据库中检索有关此问题的一些数据,并回答例如“X是开发人员”或“X是财务分析师”。这就是为什么写一个PHP脚本,原因如下:
<?php
$method = $_SERVER['REQUEST_METHOD'];
// Process when it is POST method
if ($method == 'POST') {
$requestBody = file_get_contents('php://input');
$json = json_decode($requestBody);
$text = $json->result->parameters;
switch($text) {
case 'given-name':
$name = $text->given-name;
$speech = $name . 'is a developer';
break;
default:
$speech = 'Sorry I did not get this. Can you repeat please?';
}
$response = new \stdClass();
$response->speech = "";
$response->displayText = "";
$respone->source = "webhook";
echo json_encode($response);
}
else
{
echo "Method not allowed";
}
?>
但是,该程序的输出是:Method not allowed
。
自相矛盾地$method
具有值'GET'
所以它标识了GET请求,而Dialogflow在webhook页面明确指出
您的网络服务将收到来自Dialogflow的POST请求 通过与webhook的意图匹配的用户查询的响应形式 启用。
因此我想知道:为什么我的php脚本无法从Dialogflow查看和处理POST REQUEST?
P.S。接近我的问题如下:Form sends GET instead of POST,Why is $_SERVER['REQUEST_METHOD'] always GET?。
答案 0 :(得分:0)
它不起作用,因为$_SERVER['REQUEST_METHOD']
==&#34; GET&#34;默认情况下。
所以你编程执行&#39; else&#39;条件。
您需要使用POST方法提交请求以更改此值。
您可以使用
<form method="POST">
[...]
</form>
HTML中的或
$.ajax({
url : "ajax_url.php",
type : 'POST',
data : 'data='+data,
[...]
});
在您的AJAX JS代码中
答案 1 :(得分:0)
我在下面的代码中就像你一样,你的查询将被解析,
<强>的index.php 强>
<?php
require 'get_enews.php';
function processMessage($input) {
$action = $input["result"]["action"];
switch($action){
case 'getNews':
$param = $input["result"]["parameters"]["number"];
getNews($param);
break;
default :
sendMessage(array(
"source" => "RMC",
"speech" => "I am not able to understand. what do you want ?",
"displayText" => "I am not able to understand. what do you want ?",
"contextOut" => array()
));
}
}
function sendMessage($parameters) {
header('Content-Type: application/json');
$data = str_replace('\/','/',json_encode($parameters));
echo $data;
}
$input = json_decode(file_get_contents('php://input'), true);
if (isset($input["result"]["action"])) {
processMessage($input);
}
?>
<强> get_enews.php 强>
<?php
function getNews($param){
require 'config.php';
$getNews="";
$Query="SELECT link FROM public.news WHERE year='$param'";
$Result=pg_query($con,$Query);
if(isset($Result) && !empty($Result) && pg_num_rows($Result) > 0){
$row=pg_fetch_assoc($Result);
$getNews= "Here is details that you require - Link: " . $row["link"];
$arr=array(
"source" => "RMC",
"speech" => $getNews,
"displayText" => $getNews,
);
sendMessage($arr);
}else{
$arr=array(
"source" => "RMC",
"speech" => "No year matched in database.",
"displayText" => "No year matched in database.",
);
sendMessage($arr);
}
}
?>
php://input
是一个只读流,允许您从请求正文中读取原始数据。对于POST请求,最好使用php://input