做过前端同学想必都避免不了要和后台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请求的区别的更多相关文章

  1. ajax form表单提交 input file中的文件

    ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...

  2. python中前后端通信方法Ajax和ORM映射(form表单提交)

    后端从数据库获取数据给到前端: 第一种方式: admin.py文件代码: @admin.route('/showList') def show(): # 获取数据库所有文章数据,得到一个个对象 res ...

  3. 关于AJAX与form表单提交数据的格式

    一 form表单传输文件的格式: 只有三种: multipart/form-data 一般用于传输文件,图片文件或者其他的. 那么其中我们默认的是application/x-www-form-urle ...

  4. jqPaginator分页(ajax用法和form表单提交用法)

    一般使用方法 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  5. javascprit form表单提交前验证以及ajax返回json

    1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...

  6. form表单提交转为ajax方式提交

    <form action="xxx" method="get"> //action的值是请求的url地址 <div class="f ...

  7. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

  8. 使用form表单提交请求如何获取后台返回的数据?

    问题描述 一般的form表单提交是单向的:只能给服务器发送数据,但是无法获取服务器返回的数据,也就是无法读取HTTP应答包. 想要真正的半双工通讯一般需要使用Ajax, 但是Ajax对文件传输也很麻烦 ...

  9. form表单提交没有跨域问题,但ajax提交存在跨域问题

    浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...

随机推荐

  1. linux用户及权限管理

    [文件管理.管道.用户及组管理.用户及权限管理]\用户及组管理 用户与组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  2. ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

  3. 如何制作一个完美的全屏视频H5

    写在前面的话: 最近一波H5广告火爆整个互联网圈,身为圈内人,我们怎能     不! 知!道! :( 嘘!真不知道的也继续看下去,有收获 ↓ ) So,搞懂这个并不难. 这篇文章将带你从头到尾了解H5 ...

  4. .Net Core 系列:2、ADO.Net 基础

    目录: 1.环境搭建 2.ADO.Net 基础 3.ASP.Net Core 基础 4.MD5.Sha256.AES 加密 5.实现登录注册功能 6.实现目录管理功能 7.实现文章发布.编辑.阅览和删 ...

  5. 【SignalR学习系列】4. SignalR广播程序

    创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...

  6. HDOJ2003-求绝对值

    Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行包含一个实数.   Output 对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果 ...

  7. sublime自定义配置

    { "expand_tabs_on_save": true, "font_size": 13, "ignored_packages": [ ...

  8. 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)

    为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...

  9. mk框架,一个基于react、nodejs全栈框架

    在这个前端技术爆炸的时代,不自己写套开源框架出门都不好意思跟别人打招呼,作为一个前端领域的小学生,去年年初接触了react,之后一发不可收拾爱上了它,近期重构了自己去年开源的一个项目,废话到此结束句号 ...

  10. Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比

    本文主要总结近期学习的Social Network Analysis(SNA)中的各种Centrality度量,我暂且翻译为中心度.本文主要是实战,理论方面几乎没有,因为对于庞大的SNA,我可能连门都 ...