PHP脚本接收GET而不是POST REQUEST

时间:2018-03-09 10:49:47

标签: php post xampp dialogflow

我正在使用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 POSTWhy is $_SERVER['REQUEST_METHOD'] always GET?

2 个答案:

答案 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