javascript - Netlify 表单在提交时获取 GET 而不是 POST 请求
问题描述
我有一个基本的 Netlify 表单(基于本指南),其中包含name
和email
字段message
。使用以下提交功能:
const handleSubmit = event => {
event.preventDefault();
const data = {};
const scopedForm = [...formState];
let isValidForm = validateForm(scopedForm);
setFormState([...scopedForm]);
if (!isValidForm) return false;
formInputs.forEach(input => data[input.name] = input.value);
fetch(`/`, {
method: `POST`,
headers: {
'Accept': `application/x-www-form-urlencoded;charset=UTF-8`,
'Content-Type': `application/x-www-form-urlencoded`,
},
body: encode({
'form-name': `Contact Form`,
...data,
}),
})
.then(() => console.log(`OK`))
.catch(error => alert(error));
};
const encode = data => {
return Object.keys(data)
.map(key => encodeURIComponent(key) + `=` + encodeURIComponent(data[key]))
.join(`&`);
};
非常简单,除了验证之外,我创建了一个data
对象并用一对 data[input.name] = input.value
. 一切都按预期在本地工作,以及在develop
和build
模式下。我可以看到一个POST
请求,但是,在生产中,它变成了GET
:
我已经尝试将内置更改为fetch
,axios
但结果是一样的。我不知道是否需要在我的服务器中添加一些自定义配置或如何绕过它。
我生成的 HTML 结构是:
<form name="Contact Form" method="POST" action="/" data-netlify="true" data-netlify-honeypot="bot-field" data-netlify-recaptcha="true">
<div><label for="form-name"><input type="hidden" name="form-name" value="Contact Form"></label></div>
<div><label for="bot-field"><input type="hidden" name="bot-field" value=""></label></div>
<div><label for="name">Name:<input type="text" name="name" value="Chancellor Lawson"></label></div>
<div><label for="email">Email:<input type="text" name="email" value="fivyhohy@mailinator.com"></label></div>
<div><label for="message">Message:<textarea name="message">Ea quisquam ea vel e</textarea></label></div>
<button type="submit">Send</button>
</form>
我已经阅读了很多类似的问题、文章和指南,但没有任何帮助。
解决方案
为了结束这个问题,我会回答我自己的问题,把所有优点都交给昆汀。正如他所指出的,解决方案是删除Accept
标头,因为它只接受application/x-www-form-urlencoded;charset=UTF-8
请求。所以标题应该是这样的:
headers: {
'Content-Type': `application/x-www-form-urlencoded`,
},
来自MDN 文档:
Accept 请求
HTTP
标头通告客户端能够理解的以 MIME 类型表示的内容类型。使用内容协商,服务器然后选择其中一个提案,使用它并通过Content-Type
响应头通知客户端它的选择。浏览器根据完成请求的上下文为该标头设置足够的值:获取 CSS 样式表时,为请求设置的值与获取图像、视频或脚本时不同。
推荐阅读
- javascript - 如果存在 setTimeout,则输出顺序不同
- javascript - 带有嵌套 React 组件的 onMouse 事件
- java - 麻烦理解这里的递归
- c - 给定一个有序整数数组,并在 c 中找到与给定数字最接近的值。数组可能包含重复值
- angularjs - HTML 的加载速度比 AngularJS 中的数据快
- c# - 在映射同一类的源和目标时避免 CreateMap
- c++ - '_HAS_CXX17' 宏是否可用于自定义项目标头以启用 C++17 语言集功能?
- git - Git:gnutls_handshake()失败:拉函数中的错误
- python - 如何在 Python 中将字典转换为数据框
- basic - QB64 中的循环优化