AJAX----jQuery.ajax----axios

219 阅读4分钟

一、什么是AJAX?

AJAX是异步的JavaScript和XML(Asynchronous JavaScript And XML)。简单点说,就是使用 XMLHttpRequest 对象与服务器通信。 它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。

AJAX是浏览器上的功能,

使用两个特性做如下的两件事:

- 在不重新加载页面的情况下发送请求给服务器。
- 接受并使用从服务器发来的数据。

二、如何使用AJAX?

四个步骤:

  • 创建XMLHttpRequest对象
  • 调用对象的open方法
  • 监听对象的onreadystatechange事件,在事件处理函数里面操作相关文件内容
  • 调用对象的send方法(发送请求)

代码示例:

const request = new XMLHttpRequest()
request.open("GET","/index.html")
request.onreadystatechange = () => {
	if(request.readyState === 4 && request.status === 200) {
    	console.log(request.response)
    }
}
request.send()

readyState的数值含义

  • 0 (未初始化) or (请求还未初始化)
  • 1 (正在加载) or (已建立服务器链接)
  • 2 (加载成功) or (请求已接受)
  • 3 (交互) or (正在处理请求)
  • 4 (完成) or (请求已完成并且响应已准备好)

HTTP的请求方式

  • GET系列请求
    • GET
    • DELETE 一般应用于告诉服务器,从服务器上删除点东西
    • HEAD 只想获取响应头内容,告诉服务器响应主体内容不要了
    • OPTIONS 试探性请求,发个请求给服务器,看看服务器能不能接收到,能不能返回
  • POST系列请求
    • POST
    • PUT 和DELETE对应,一般是想让服务器把我传递的信息存储到服务器上(一般应用于文件和大型数据内容)

get 和 post 区别?

GET系列一般用于从服务器获取信息,POST系列一般用于给服务器推送信息,但是不论GET和POST都可以把信息传递给服务器,也能从服务器获取到结果,只不过是谁多谁少的问题

GET - 从指定的资源请求数据。

  • 查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
    • GET 请求可被缓存
    • GET 请求保留在浏览器历史记录中
    • GET 请求可被收藏为书签
    • GET 请求不应在处理敏感数据时使用
    • GET 请求有长度限制
    • GET 请求只应当用于取回数据

POST - 向指定的资源提交要被处理的数据

  • 查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
    • POST 请求不会被缓存
    • POST 请求不会保留在浏览器历史记录中
    • POST 不能被收藏为书签
    • POST 请求对数据长度没有要求

客户端怎么把信息传递给服务器?

  • 问号传参 request.open('GET','/getdata?xxx=xxx&xxx=xxx')
  • 设置请求头 request.setRequestHeader([key],[value])
  • 设置请求主体 request.send(请求主体信息)

服务器怎么把信息返回给客户端?

  • 通过响应头
  • 通过响应主体(大部分信息都是基于响应主体返回的)

GET系列和POST系列的本质区别

  • GET传递给服务器的内容比POST少,因为URL有最长大小限制(IE浏览器一般限制2KB,谷歌浏览器一般限制4~8KB,超过长度的部分自动被浏览器截取了)
  • GET会产生缓存(缓存不是自己可控制的):因为请求的地址(尤其是问号传递的信息一样),浏览器有时候会认为你要和上次请求的数据一样,拿的是上一次信息;这种缓存我们不期望有,我们期望的缓存是自己可控制的;所以真实项目中,如果一个地址,GET请求多次,我们要去除这个缓存;
  • GET相比较POST来说不安全:GET是基于问号传参传递给服务器内容,有一种技术叫做URL劫持,这样别人可以获取或者篡改传递的信息;而POST基于请求主体传递信息,不容易被劫持;

三、jQuery.ajax与axios

行内人都知道,初级工程师学习API的使用,中级程序员学习封装,高级程序员学习造轮子,为了能够更加方便的使用ajax,有一群前端工程师封装了两个库。

其一,是使用最为广泛的jQuery库里的jQuery.ajax,其二则是最新的更加好用的axios库。

jQuery.ajax这个库已经非常的完美了,支持更多形式的参数,支持Promise,支持的功能超多。但是这个目前专业的前端都在用axios了。

四、jQuery.ajax

<script src="js/jquery.min.js"></script>
	<script>
		/* 
		 * $.ajax() 基于原生JS的AJAX四步操作进行封装
		 *    $.ajax([URL],[OPTIONS])
		 *    $.ajax([OPTIONS])  URL在配置项中(推荐)
		 *    $.get/post/getJSON/getScript()
		 *    ......
		 * 配置项信息
		 *    url:请求的API接口地址
		 *    method:HTTP请求方式,默认GET
		 *    data:传递给服务器的信息,默认null(可以是字符串,可以是对象,而且如果GET系列请求,JQ会自动把信息拼接到URL的末尾,基于问号传参传递给服务器;如果是POST请求,JQ会基于请求主体,把信息传递给服务器)
		 *    dataType:预设服务器返回的结果格式(服务器返回的一般都是JSON格式的字符串,如果我们设置了DATA-TYPE,JQ会根据设置的类型,把服务器返回的结果处理为对应的格式),支持的内容text / json / xml / html / script / jsonp(跨域) =>不影响服务器返回的结果,只是把服务器返回的结果进行二次处理
		 *    async:是否为异步操作,默认是TRUE,代表异步操作,同步操作太傻了
		 *    cache:缓存处理,只对GET系列请求有作用,默认是TRUE不处理缓存,当我们设置FALSE后,JQ帮我们在URL的末尾设置一个随机数
		 *    contentType:设置传递给服务器内容的格式类型 默认是"application/x-www-form-urlencoded"
		 *        客户端传递给服务器信息的格式(类型一般都是字符串),常用的:
		 *        form-data表单数据:JSON格式 '{"name":"xxx","lx":1}'
		 *        x-www-form-urlencoded:name=xxx&lx=1
		 *        raw:纯文本格式
		 *    headers:设置请求头信息,他是一个对象
		 *    timeout:设置超时的时间
		 *    success:回调函数,当数据请求成功执行,方法中的参数就是从服务器获取的结果
		 *    error:回调函数,数据请求失败执行,方法中的参数是错误信息
         *	  complete: Function( jqXHR jqXHR, String textStatus )请求完成后回调函数 (请求success 和 error之后均调用)。这个回调函数得到2个参数: jqXHR (XMLHTTPRequest) 对象和一个描述请求状态的字符串("success", "notmodified", "error", "timeout", "abort", 或者 "parsererror") 。从jQuery 1.5开始, complete设置可以接受一个函数的数组。每个函数将被依次调用。这是一个Ajax事件 
		 */
		$.ajax({
			url: 'http://example.com/login_in.php',
			method: 'POST',
			data: {
				name: 'zhufeng',
				lx: 'teacher'
			},
			dataType: 'json',
			async: true,
			cache: false,
			headers: {},
			success: (result, status, xhr) => {
				//=>xhr:是JQ帮我们处理过的AJAX实例
				console.log(result, status, xhr);
			}
		});
	</script>
    
    
    
/*
*	jqXHR.done(function(data, textStatus, jqXHR) {});
*	一个可供选择的 success 回调选项的构造函数,.done()方法取代了的过时的jqXHR.success()方法
*
*	jqXHR.fail(function(jqXHR, textStatus, errorThrown) {});
*	一种可供选择的 error 回调选项的构造函数,.fail()方法取代了的过时	
*	的.error()方法。
*
*	jqXHR.always(function(data|jqXHR, textStatus,jqXHR|errorThrown) { });
*	一种可供选择的 complete 回调选项的构造函数,.always()方法取代了的*	过时的.complete()方法。
*
*	在响应一个成功的请求后,该函数的参数和.done()的参数是相同的:data, *textStatus, 和 jqXHR 对象.对于失败的请求,参数和.fail()的参数是相同*的:jqXHR 对象, textStatus, 和 errorThrown。
*
*	jqXHR.then(function(data, textStatus, jqXHR) {}, function(jqXHR, *textStatus, errorThrown) {});
*	包含了 .done() 和 .fail()方法的功能,
*
*/
<script>
//JQ支持了Promise
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax( "example.php" )
    .done(function() { alert("success"); })
    .fail(function() { alert("error"); })
    .always(function() { alert("complete"); });
 
// perform other work here ...
 
// Set another completion function for the request above
jqxhr.always(function() { alert("second complete"); });

var xhr=$.ajax('example.php',{[options]}).then(()=>{},()=>{})
</script>	

五、axios

axios作为专业前端目前最受欢迎的库,想必大家都是知晓的。 基于promise,用于浏览器和node.js的http客户端

特点

  • 支持浏览器和 node.js
  • 支持 promise
  • 能拦截请求和响应
  • 能转换请求和响应数据
  • 能取消请求(但是取消的不是Promise,Promise是不可以被取消的,能被取消还承什么诺呢?)
  • 自动转换 JSON 数据
  • 浏览器端支持防止 CSRF (跨站请求伪造)

具体使用方法,参见我的另一篇博客


以上内容是个人的一些浅见,如有错误欢迎评论区指正补充。谢谢大家!