【问题标题】:PHP script receives GET instead of POST REQUESTPHP 脚本接收 GET 而不是 POST REQUEST
【发布时间】:2018-03-09 10:49:46
【问题描述】:

我正在使用带有 XAMPP 和 Dialogflow 的 PHP 来创建聊天界面。在 Dialogflow 中的一个简单意图(问题)中,我为 XAMPP 创建了一个关于“谁是 X”的问题(例如 Paul、George)的 webhook。因此,我放置了一个 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 REQUEST,而 Dialogflow 在 webhook 页面上明确声明

您的网络服务将收到来自 Dialogflow 的 POST 请求 对与 webhook 的意图匹配的用户查询的响应形式 已启用。

因此我想知道:为什么我的 php 脚本无法看到和处理来自 Dialogflow 的 POST REQUEST?

附:与我关系密切的问题如下:Form sends GET instead of POSTWhy is $_SERVER['REQUEST_METHOD'] always GET?

【问题讨论】:

  • $method的值是多少?
  • 感谢您的回复。自相矛盾的是 GET ......这是为什么呢?
  • 您最初是如何提出请求的?
  • 在 Dialogflow 中它说:“您的 Web 服务将收到来自 Dialogflow 的 POST 请求,其形式是对启用 webhook 的意图匹配的用户查询的响应”...
  • 这就是您设置为 Dialogflow 实现的 webhook?您能否更新您的问题以包含 Dialogflow 配置的执行页面的屏幕截图?

标签: php post xampp dialogflow-es


【解决方案1】:

它不起作用,因为默认情况下$_SERVER['REQUEST_METHOD'] == "GET"。 所以你程序执行'else'条件。

您需要使用 POST 方法提交请求才能更改此值。

你可以使用

<form method="POST">
    [...]
</form>

在您的 HTML 中,或

$.ajax({
        url : "ajax_url.php",
        type : 'POST',
        data : 'data='+data,
        [...]
    });

例如在你的 AJAX JS 代码中

【讨论】:

  • 感谢您的回复(点赞)。但是,我不直接了解在我的初始源代码中究竟将这个附加源代码放在哪里。你能说得清楚一点吗?
  • 是的!你能告诉我为什么你需要一个 POST 请求方法来执行你的程序吗?
  • 是的,我还编辑了我的帖子以包含此内容。我放置了一个 POST REQUEST 以访问 DIAlogflow 中问题的 json 形式(用户在 DIAlogflow 中提出的问题),以便我可以随心所欲地回答。
  • 具体来说,这样做的最终目标是从 phpMyAdmin 中的 MySQL 数据库中检索有关此问题的一些数据,并回答例如“X 是开发人员”或“X 是金融分析师”。
  • 如果这是从 Dialogflow 发送的,则不涉及网页,因此不能有
    标签。
【解决方案2】:

我在下面的代码中与您一样,您的查询将得到解决,

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

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多