Form表单提交,Ajax请求,$http请求的区别
做过前端同学想必都避免不了要和后台server打交道。而以下这三种与后台交互的方式想必大家都不陌生。
Form表单提交,Ajax请求,Angular的$http请求
以前一直搞不清楚什么时候应该用哪种方式请求数据,正好最近在做文件上传相关业务,顺便对这三种方式的使用场景及区别做个简单总结。
用法
以下是三种请求方式的API详细介绍:
Form:
https://www.w3schools.com/html/html_forms.asp
Ajax:
http://api.jquery.com/jQuery.ajax/
Angular $http:
https://angular.io/api/common/http
区别
Form VS Ajax, $http
1、提交方式
form表单通常是通过在HTML中定义的action,method及submit来进行表单提交,另外也可以通过在js中调用submit函数来进行表单提交。
具体的提交方式有很多种,比如可以通过封装成XMLHttpRequest对象进行提交,这里就不一一详述了。
而另外两种请求(Ajax,$http)都是基于XMLHttpRequest进行的。
2、页面刷新
Form提交,更新数据完成后,需要转到一个空白页面再对原页面进行提交后处理。哪怕是提交给自己本身的页面,也是需要刷新的,因此局限性很大。
Ajax,$http都可以实现页面的局部刷新,整个页面不会刷新。
3、请求由谁来提交
Form提交是浏览器完成的,无论浏览器是否开启JS,都可以提交表单。
Ajax,$http是通过js来提交请求,请求与响应均由js引擎来处理,因此不启用JS的浏览器,无法完成该操作。
4、是否可以上传文件
最初,ajax出于安全性考虑,不能对文件进行操作,所以就不能通过ajax来实现文件上传,但是通过隐藏form提交则可以实现这个功能,所以这也是用隐藏form提交的主要用途。
后来XMLHttpRequest引入了FormData类型,使得通过Ajax也可以实现文件上传,稍后会详细介绍。
Ajax VS $http
1、默认Content-type类型
Ajax默认的Content-type是 x-www-form-urlencoded
$http默认的Content-type是 application/json
2、async
Ajax支持同步通信(async:false)
$http不支持async:false
3、参数处理
Ajax在post数据之前jQuery会对数据进行序列化,转换成字符串:"a=1&b=2"这种形式,然后把post的参数拼接到url上发送。
$http不会对数据做参数处理,数据将以json格式发送。
这样就会导致一个问题:有些请求通过Ajax可以请求成功,但是通过$http却失败了。
当然,我们可以通过做一些处理来实现这两种请求的统一。
可以从angular层面解决,把angular的post请求也按照jquery的方法做些改变,如下:
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
https://github.com/petersirka/total.js/issues/26
通过Ajax提交文件
前面讲过,可以通过传统的form表单实现文件上传,不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,
这种时候我们都是使用Ajax的方式进行请求的。
这时候就要用到一个对象FormData。
FormData类型其实是在XMLHttpRequest Level 2定义的,它是为序列化表以及创建与表单格式相同的数据提供的。
目前几乎所有的主流的浏览器都已经支持这个对象了。参见
https://developer.mozilla.org/zh-CN/docs/Web/API/FormData
以下为代码实现:
<form id="id_form">
<input type="text" name="name"/>
<input type="number" name="age"/>
<input type="file" name="fileName"/>
<input type="button" value="sumbit" onclick="onSubmit();"/>
</form>
function onSubmit(){
/* 可以通过两种方法获取文件 */
// // 方法一: 直接获取表单值
// var formData = new FormData(document.getElementById("id_form")); // 方法二:通过FormData的append方法动态添加属性
var nameVal = $("input[name='name']").val();
var ageVal = $("input[name='age']").val();
var files = document.querySelector('input[type=file]').files;
var formData = new FormData();
formData.append("nameKey", nameVal);
formData.append("ageKey", ageVal);
formData.append("fileKey", files[0]); /* 可以通过两种方式实现文件上传 */
// // 方法一: 通过构建一个XMLHttpRequest对象实现上传
// var req = new XMLHttpRequest();
// req.open("post", "http://xxx/public/upload", false);
// req.send(formData); // 方法二:通过Ajax实现上传
$.ajax({
url:"http://xxx/public/upload",
type:"POST",
data:formData,
processData:false,
contentType:false,
success:function(data){
console.log("response success: ", data);
},
error:function(error){
alert("response error: ", error);
}
});
}
Form表单提交,Ajax请求,$http请求的区别的更多相关文章
- ajax form表单提交 input file中的文件
ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...
- python中前后端通信方法Ajax和ORM映射(form表单提交)
后端从数据库获取数据给到前端: 第一种方式: admin.py文件代码: @admin.route('/showList') def show(): # 获取数据库所有文章数据,得到一个个对象 res ...
- 关于AJAX与form表单提交数据的格式
一 form表单传输文件的格式: 只有三种: multipart/form-data 一般用于传输文件,图片文件或者其他的. 那么其中我们默认的是application/x-www-form-urle ...
- jqPaginator分页(ajax用法和form表单提交用法)
一般使用方法 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- javascprit form表单提交前验证以及ajax返回json
1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...
- form表单提交转为ajax方式提交
<form action="xxx" method="get"> //action的值是请求的url地址 <div class="f ...
- jQuery实现form表单基于ajax无刷新提交方法详解
本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...
- 使用form表单提交请求如何获取后台返回的数据?
问题描述 一般的form表单提交是单向的:只能给服务器发送数据,但是无法获取服务器返回的数据,也就是无法读取HTTP应答包. 想要真正的半双工通讯一般需要使用Ajax, 但是Ajax对文件传输也很麻烦 ...
- form表单提交没有跨域问题,但ajax提交存在跨域问题
浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...
随机推荐
- linux用户及权限管理
[文件管理.管道.用户及组管理.用户及权限管理]\用户及组管理 用户与组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...
- ASP.NET Core API 版本控制
几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...
- 如何制作一个完美的全屏视频H5
写在前面的话: 最近一波H5广告火爆整个互联网圈,身为圈内人,我们怎能 不! 知!道! :( 嘘!真不知道的也继续看下去,有收获 ↓ ) So,搞懂这个并不难. 这篇文章将带你从头到尾了解H5 ...
- .Net Core 系列:2、ADO.Net 基础
目录: 1.环境搭建 2.ADO.Net 基础 3.ASP.Net Core 基础 4.MD5.Sha256.AES 加密 5.实现登录注册功能 6.实现目录管理功能 7.实现文章发布.编辑.阅览和删 ...
- 【SignalR学习系列】4. SignalR广播程序
创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...
- HDOJ2003-求绝对值
Problem Description 求实数的绝对值. Input 输入数据有多组,每组占一行,每行包含一个实数. Output 对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果 ...
- sublime自定义配置
{ "expand_tabs_on_save": true, "font_size": 13, "ignored_packages": [ ...
- 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)
为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...
- mk框架,一个基于react、nodejs全栈框架
在这个前端技术爆炸的时代,不自己写套开源框架出门都不好意思跟别人打招呼,作为一个前端领域的小学生,去年年初接触了react,之后一发不可收拾爱上了它,近期重构了自己去年开源的一个项目,废话到此结束句号 ...
- Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比
本文主要总结近期学习的Social Network Analysis(SNA)中的各种Centrality度量,我暂且翻译为中心度.本文主要是实战,理论方面几乎没有,因为对于庞大的SNA,我可能连门都 ...