新闻中心
使用Fetch API提交表单数据并处理异步响应的教程

本教程详细介绍了如何使用j*ascript的fetch api异步提交html表单数据。我们将探讨从传统formdata直接提交到更现代、更灵活的json格式提交,并重点讲解如何利用`async/await`语法简化异步代码、优化错误处理,以及如何正确地将表单数据转换为json格式并设置相应的http请求头,以确保与后端api的顺畅通信。
在现代Web开发中,异步提交表单数据是提升用户体验的关键。Fetch API是J*aScript中用于执行网络请求的强大工具,但正确地使用它来发送表单数据,特别是处理响应和错误,需要一些技巧。本文将指导您完成这一过程,从基础的表单数据收集到高级的异步控制流和数据格式化。
1. 异步提交表单的基础
当用户在Web表单中输入信息并点击提交按钮时,我们通常希望在不刷新整个页面的情况下将数据发送到服务器。这可以通过监听表单的submit事件并阻止其默认行为来实现。
首先,获取表单元素并为其添加事件监听器:
const addBooking_form = document.getElementById("form_addResa");
addBooking_form.addEventListener("submit", (event) => {
// 阻止表单的默认提交行为,即页面刷新
event.preventDefault();
// 后续将在这里处理数据发送逻辑
});2. 收集表单数据
Fetch API可以接受多种类型的请求体,其中一种是FormData对象。FormData可以直接从HTML表单元素构建,它会自动收集所有具有name属性的输入字段的值。
// ...在event.preventDefault()之后...
const formData = new FormData(addBooking_form);
// 您可以通过以下方式查看FormData的内容(仅限开发工具)
// for (let pair of formData.entries()) {
// console.log(pair[0] + ': ' + pair[1]);
// }虽然FormData可以直接作为Fetch请求的body发送(默认Content-Type为multipart/form-data),但许多现代API更倾向于接收JSON格式的数据。
3. 使用async/await简化异步请求
传统的Promise.then().then()链式调用在处理复杂的异步逻辑时可能会变得难以阅读和维护。async/await语法提供了一种更同步、更直观的方式来编写异步代码。
要使用async/await,您需要将事件监听器的回调函数标记为async:
火龙果写作
用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。
277
查看详情
addBooking_form.addEventListener("submit", async (event) => { // 注意这里的 async 关键字
event.preventDefault();
// ... 异步逻辑 ...
});4. 将表单数据转换为JSON格式
为了与大多数RESTful API更好地兼容,通常建议将表单数据转换为JSON对象,并通过Fetch发送。Object.fromEntries()方法可以方便地将FormData对象转换为普通的J*aScript对象。
addBooking_form.addEventListener("submit", async (event) => {
event.preventDefault();
// 使用 Object.fromEntries 将 FormData 转换为普通对象
const formDataObject = Object.fromEntries(new FormData(event.target));
// console.log(formDataObject); // 查看转换后的对象
// ... 后续发送请求 ...
});重要提示: event.target在这里直接引用了触发事件的表单元素,即addBooking_form,这是一种更简洁的写法。
5. 发送JSON格式的Fetch POST请求
当发送JSON数据时,您需要执行两个关键步骤:
- 使用JSON.stringify()将J*aScript对象转换为JSON字符串。
- 在请求头中设置Content-Type: application/json,告知服务器请求体是JSON格式。
同时,结合try...catch块来优雅地处理网络错误和服务器响应错误。
addBooking_form.addEventListener("submit", async (event) => {
event.preventDefault();
const formDataObject = Object.fromEntries(new FormData(event.target));
try {
const response = await fetch("api/booking/new", {
method: "POST",
headers: {
'Content-Type': 'application/json' // 明确指定请求体为JSON
},
body: JSON.stringify(formDataObject) // 将对象转换为JSON字符串
});
// 检查HTTP响应状态码
if (!response.ok) {
// 如果响应状态码不是2xx,抛出错误
const errorText = await response.text();
throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);
}
// 解析JSON响应数据
const data = await response.json();
console.log("预订成功:", data);
// 假设有一个元素用于显示结果
const table = document.getElementById("some_table_id"); // 替换为实际的元素ID
if (table) {
table.innerHTML = JSON.stringify(data, null, 2); // 美化JSON输出
}
} catch (error) {
console.er
ror("提交预订时发生错误:", error);
// 在UI上显示错误信息
alert(`提交失败: ${error.message || '未知错误'}`);
}
console.log('新预订提交流程完成');
});HTML表单示例: 为了确保FormData能够正确收集数据,您的HTML表单输入字段必须包含name属性。
<form id="form_addResa">
<div class="fieldset flexCol-around">
<label for="input_lieu">Lieu *</label>
<select id="input_lieu" name="place">
<option value="none">< Séléctionner un lieu ></option>
<option value="Salammbô">Salammbô</option>
<option value="Pergola">Pergola</option>
<option value="Salon Jaune">Salon Jaune</option>
<option value="1001 Bougies">1001 bougies</option>
</select>
<div class="flexRow-around">
<div class="flexCol-around">
<label for="input_date">Date *</label>
<input id="input_date" type="date" name="date">
</div>
<div class="flexCol-around">
<label for="input_time">Heure *</label>
<input id="input_time" type="time" name="time">
</div>
</div>
<label for="input_nom">Nom *</label>
<input id="input_nom" type="text" name="name">
<label for="input_prenom">Prénom *</label>
<input id="input_prenom" type="text" name="firstName">
</div>
<div class="fieldset flexCol-around">
<label for="input_couverts">Nombre de couverts *</label>
<input id="input_couverts" type="number" name="coverts">
<label for="input_intExt">Client interne / externe *</label>
<select name="intExt" id="input_intExt">
<option value="ext">Externe</option>
<option value="int">Interne</option>
</select>
<label for="input_contacte">Contacter le client *</label>
<input id="input_contacte" type="text" placeholder="Numéro de chambre / téléphone / E-mail" name="contact">
</div>
<div class="fieldset">
<textarea id="input_note" placeholder="Note :" name="notes"></textarea>
</div>
<div class="flexRow-around">
<input type="reset" value="Annuler" style="background: white;">
<input type="submit" value="提交">
</div>
</form>请注意,原HTML中的onclick="unselectBooking();"被移除,因为异步提交逻辑已经完全在submit事件监听器中处理。
6. 注意事项与最佳实践
- 服务器端匹配: 确保您的后端API期望接收JSON格式的数据。如果后端期望multipart/form-data,那么直接发送new FormData(formElement)作为body可能更合适,但通常JSON更灵活。
- 错误处理: try...catch块只能捕获网络错误或在await Promise被拒绝时抛出的错误。对于HTTP状态码(如404 Not Found, 500 Internal Server Error),Fetch API的response.ok属性是判断请求是否成功的关键。您应该根据response.ok的值来决定如何处理响应。
- 响应解析: 根据服务器返回的数据类型,使用response.json()(如果返回JSON)或response.text()(如果返回纯文本)来解析响应体。请注意,这些方法本身也返回Promise。
- 用户反馈: 在发送请求时,可以禁用提交按钮或显示加载指示器,并在请求完成后更新UI,提供良好的用户体验。
- 路径解析: fetch("api/booking/new", ...)中的路径api/booking/new是一个相对路径。它会相对于当前页面的URL进行解析。确保这个路径指向正确的后端API端点。
总结
通过本教程,您应该已经掌握了如何使用Fetch API和async/await语法异步提交表单数据。关键在于正确地将表单数据转换为服务器期望的格式(通常是JSON),设置正确的HTTP请求头,并利用try...catch块实现健壮的错误处理。这种方法不仅使代码更清晰、更易于维护,也为用户提供了更流畅的Web体验。
以上就是使用Fetch API提交表单数据并处理异步响应的教程的详细内容,更多请关注其它相关文章!
# java
# html
# js
# javascript
# 可以直接
# 广西线上推广网络营销有哪些
# 请注意
# 链式
# 您需要
# 在线seo优化引流
# 营销推广费用预算如何
# SeO2氧化苄基
# 宁夏小程序网站建设开发
# 外贸查关键词排名软件
# 台湾抖音营销推广方式
# seo软文该怎么写
# 临沂企业网站建设推广
# 新乡县seo快排
# 正确地
# 您的
# 回调
# 转换为
# 表单
# restfu
# 状态码
# ai
# 后端
# 工具
# 回调函数
# app
# go
# json
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
Angular中父组件异步更新子组件复选框状态的实践指南
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
知音漫客正版漫画平台_知音漫客官网账号登录
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
如何有效阻止外部脚本意外修改内联样式的高度属性
在哪找SublimeJ远程工具_SFTP插件配置教程
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
2025-2030年全球乘用车销量预测:新能源成增长主力
解决Python单元测试中Mock异常方法调用计数为零的问题
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
生成rdflib自定义SPARQL函数:参数匹配与实践指南
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
4399免费游戏网址入口 4399小游戏免费入口点开即玩
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
Android Studio计算器C键功能异常排查与修复教程
押井守高度称赞《辐射4》:玩了八年都停不下来!
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
b站赚钱渠道_b站收益来源
韩小圈电脑版在线入口_网页版免费登录地址
《刺客信条:影》PS5 Pro和Switch 2画面对比
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
抓大鹅无需下载版 抓大鹅秒玩版入口
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
百度网盘网页版入口 百度网盘网页版官方登录网址
美团外卖商家服务中心入口 美团商家版官网入口
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
J*a应用程序首次运行自动创建文件与目录的最佳实践
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Log4j Console Appender性能瓶颈与高并发优化策略
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
J*aScript实现单选按钮与关联输入框的联动禁用教程
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
天眼查企业查询官网入口 天眼查官方网页版查询
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
如何将HTML表格多行数据保存到Google Sheets
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器


2025-11-07
浏览次数:次
返回列表
ror("提交预订时发生错误:", error);
// 在UI上显示错误信息
alert(`提交失败: ${error.message || '未知错误'}`);
}
console.log('新预订提交流程完成');
});