我正在编写一个程序,该程序从网站获取输入并通过 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']);
}
您在错误的位置查找内容类型。它是一个 HTTP 标头,而不是请求参数,因此不要查看
$_POST['CONTENT_TYPE']
,而是查看 $_SERVER['HTTP_CONTENT_TYPE']
。
apache_request_headers()
函数 来获取所有传入的请求标头(不,您不需要使用 Apache 来实现此操作):
var_dump(apache_request_headers());