Запрос ответа POST API POST возвращает пустой текст - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь получить ответ на почтовый запрос, который отправляю через fetch (), но в результате возвращается пустой текст.

JS:

async getTotalCompletionTimes()
{
    var res = await fetch("repository/maps.php?method=getcompletiontimes&map="+this.getName(), {method: 'POST'});
    const result = await res.text();
    return result;
}

PHP

<?php
require_once("user.php");
if($_SERVER["REQUEST_METHOD"] == "POST")
{
<some code>
else if(isset($_POST["method"]) && $_POST["method"] == "getcompletiontimes" && isset($_POST["map"]))
{
    $times = 0;
    $users = glob('../users/*', GLOB_ONLYDIR);
    foreach($users as $u)
    {
        if(!file_exists($u."/maps.json")) continue;
        $json = json_decode(file_get_contents($u."/maps.json"), true);
        foreach($json as $map => $v)
        {
            if($map == $_POST["map"])
            {
                $times += $v;
            }
        }
    }
    echo $times;
}
<some other code>
?>

Я протестировал ответ php с помощью curl в cmd: curl -X POST localhost / game / repository / maps. php -d "method = getcompletiontimes & map = map_1", и он вернулся «2» в ответ.

1 Ответ

0 голосов
/ 11 января 2020

Запрос curl к серверу - это запрос HTTP POST с типом контента application/x-www-form-urlencoded, и данные передаются аналогично тому, как браузеры отправляют форму HTML. Эти данные запроса содержат параметры 'method' и 'map'.

Однако в реализации fetch параметры 'method' и 'map' отправляются как параметры запроса URL. Таким образом, они недоступны в глобальном массиве $_POST, но в глобальном массиве $_GET.

Параметры 'method' и 'map' могут быть отправлены на сервер аналогично curl один, установив параметр body данных инициализации fetch, который будет содержать данные формы, содержащие оба параметра.

async getTotalCompletionTimes()
{
    const fd = new FormData();
    fd.append("method", "getcompletiontimes");
    fd.append("map", this.getName());
    const res = await fetch(
      "repository/maps.php",
      {
        method: "POST",
        body: fd
      });
    const result = await res.text();
    return result;
}
...