PHP 未从 javascript fetch api 接收任何 POST 请求正文

问题描述 投票:0回答:1

我正在编写一个程序,该程序从网站获取输入并通过 phpMailer 发送输入的数据。我使用 javascript fetch 通过 post 请求发送 json 信息。我也在使用 php 运行 Fat-Free。问题是我无法在服务器上接收 json。

我在错误报告中得到的是 500 内部服务器错误 - 内容类型必须是 application/json

我相信这可能是一个cors问题,但即使是这样,我也不知道该怎么做以及如何解决这个问题。我所知道的是,服务器确实有一个请求传入,但我什至无法获得输出或传入的后数组的任何内容,就好像没有传入的后数组一样。所以我什至看不到我是什么处理。我尝试将帖子数组输出到日志文件中,这样我就可以看到我收到的内容,我得到的只是:array()。即使当我通过 postMan 发送测试 json 时,我在 post 数组中什么也得不到。因此,“Content-Type 必须是 application/json”错误可能是因为 Post 数组中没有任何内容。另外,如果我通过邮递员删除 applucation/json 检查器功能,他们的电子邮件会按照我想要的方式成功发送,而如果我尝试通过网站表单发送它,则电子邮件不会发送。

JAVASCRIPT

function prepareSendList(){
    let newsletterRecipients = retrieveCheckedSubscribers();

    newsletterRecipients.forEach(recipient => {
        sendToMailer(createEnvelope(recipient));
    });
}

function createEnvelope(clientID){
    let fname = document.querySelector(`#cr-${clientID} > .fname`).textContent;
    let lname = document.querySelector(`#cr-${clientID} > .lname`).textContent;
    let email = document.querySelector(`#cr-${clientID} > .email`).textContent;
    let pm = document.querySelector(`#pm-${clientID}`).value;

    return {
        fname: fname,
        lname: lname,
        email: email,
        pm: pm
    };
}

function sendToMailer(newsletterEnvelope) {
    let uri = "http://localhost/mailer/send";
    let params = {
        method: "POST",
        body: JSON.stringify(newsletterEnvelope),
        headers: {
            "Content-Type": "application/json"
        }
    };

    fetch(uri, params)
        .then(r => {
            console.log(r);
        });
}

PHP

$f3->route('GET|POST /send', function(){
    $GLOBALS['controller']->send();
});
      
function send(){
        $myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
        fwrite($myfile, var_export($_POST, true));
        fclose($myfile);

        if($_SERVER['REQUEST_METHOD'] != 'POST'){
            throw new Exception("Only POST Requests Permitted");
        }

        $content_type = isset($_POST['CONTENT_TYPE']) ? $_POST['CONTENT_TYPE'] : "";
        if(stripos($content_type, 'application/json') === false){
            throw new Exception("Content-Type must be application/json");
        }

        $body = file_get_contents("php://input");

        $envelope = json_decode($body, true);
        $GLOBALS['newsletterSender'] ->
          sendMail($envelope['email'], $envelope['fname'], $envelope['lname'],
            "ShadowGraph Newsletter", "", $envelope['pm']);
}
post cors fetch-api phpmailer fat-free-framework
1个回答
0
投票

您在错误的位置查找内容类型。它是一个 HTTP 标头,而不是请求参数,因此不要查看

$_POST['CONTENT_TYPE']
,而是查看
$_SERVER['HTTP_CONTENT_TYPE']

您还可以使用

apache_request_headers()
函数 来获取所有传入的请求标头(不,您不需要使用 Apache 来实现此操作):

var_dump(apache_request_headers());
© www.soinside.com 2019 - 2024. All rights reserved.