javascript - 使用 Fetch API 邮寄表单数据

标签 javascript php ajax fetch fetch-api

我正在尝试使用 Fetch API 从表单中检索数据并将其邮寄,但我收到的电子邮件是空的。响应似乎成功,但没有发送任何数据。我做错了什么?

这是我的 JS 代码和我的 php/html 片段(如果相关)

(function() {

  const submitBtn = document.querySelector('#submit');

  submitBtn.addEventListener('click', postData);

  function postData(e) {
    e.preventDefault();

    const first_name = document.querySelector('#name').value;
    const email = document.querySelector('#email').value;
    const message = document.querySelector('#msg').value;

    fetch('process.php', {
        method: 'POST',
        body: JSON.stringify({first_name:first_name, email:email, message:message})
    }).then(function (response) {
      console.log(response);
      return response.json();
    }).then(function(data) {
      console.log(data);
      // Success
    });

  }

})();



<!-- begin snippet: js hide: false console: true babel: false -->
<?php 
    $to = "example@mail.com"; 
    $first_name = $_POST['first_name'];
    $from = $_POST['email']; 
    $message = $_POST['message'];
    $subject = "Test Email";
    $message = $first_name . " sent a message:" . "\n\n" . $message;
    $headers = "From:" . $from;
    mail($to,$subject,$message,$headers);
?>


<form action="" method="post" class="contact__form form" id="contact-form">
  <input type="text" class="form__input" placeholder="Your Name" id="name" name="first_name" required="">
  <input type="email" class="form__input" placeholder="Email address" id="email" name="email" required="">
  <textarea id="msg" placeholder="Message" class="form__textarea" name="message"/></textarea>
  <input class="btn" type="submit" name="submit" value="Send" id="submit"/>
</form>

最佳答案

PHP 不理解 JSON 请求主体。因此,当向其发送 JSON 文本时,PHP 不会自动解析 JSON 并将数据放入全局 $_POST 变量中。

此外,当正文只是文本时,fetch() 将使用默认的 mime text/plain 作为内容类型。因此,即使您将 body 设置为 x-www-form-urlencoded 格式的数据,它也不会将请求 header 设置为正确的 header ,PHP 也不会这样做。无法正确解析它。

您要么必须手动获取发送的数据并自行解析:

<?php

$dataString = file_get_contents('php://input');
$data = json_decode($dataString);
echo $data->first_name;

通过显式设置内容类型 header 并传递正确格式的body,以不同的内容类型发送数据,即application/x-www-form-urlencoded :

fetch('/', {
  method: 'POST',
  headers:{
    "content-type":"application/x-www-form-urlencoded"
  },
  body: "first_name=name&email=email@example.com"
})

或者甚至创建一个 FormData 对象并让 fetch 自动检测要使用的正确内容类型:

var data = new FormData();
data.append('first_name','name');
data.append('email','email@example.com');

fetch('/', {
  method: 'POST',
  body: data
})

关于javascript - 使用 Fetch API 邮寄表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50071503/

相关文章:

javascript - PHP/JavaScript : See if someone is visiting the same url

javascript - jQuery Ajax - 错误响应

javascript - 为什么我们需要 javascript 中的自引用对象

javascript - 从转换为 ISO 字符串的日期中删除秒/毫秒

php - Codeigniter 重复模板

php - 使用 jQuery 重新设计表单样式?

javascript - 如何使用不和谐机器人返回变量

javascript - 动画完成后旋转的图标会弹回

php - 什么可以防止覆盖服务器中的 Access-Control-Allow-Origin?

javascript - 从数据库填充下拉框而不重新加载页面