欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JQuery中的Ajax请求

程序员文章站 2022-05-03 21:36:21
...

一、 原生Ajax请求

  • get与post请求的区别
    get请求js代码如下: get请求,请求参数是拼接在url后面的。 ?num=1&name=abc
	//1.创建对象
	var xmlhttp = new XMLHttpRequest();
	//2.打开后台接口,发送请求
	//get请求,请求参数是拼接在url后面的。 ?num=1&name=abc
	xmlhttp.open("GET", "https://autumnfish.cn/api/joke/list?num=1", true);
	//3.发送请求
	xmlhttp.send();
	//4.接收服务端的响应
	xmlhttp.onreadystatechange = function() {
		//判断readyState就绪状态是否为4,判断status响应状态码是否为200
		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			//获取服务器的响应结果
			var responseText = xmlhttp.responseText;
			//alert(responseText);
			var obj=JSON.parse(responseText);
			var text=obj.jokes[0]
			var bd=document.body;
			bd.innerText=text;
		}
	}

post请求:open函数只写url,不写参数;post请求要设置请求头信息;send函数写请求的参数;

		//1.创建ajax对象
		var ajax = new XMLHttpRequest();
		//2.连接服务器
		ajax.open('post', 'http://localhost:8080/login', true);
		//3.post请求要设置请求头信息 
		ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
		//4.发送请求,post请求的请求参数要写到send()方法里面
		ajax.send("username=张三&password=123456");
		//接收后台的响应
		ajax.onreadystatechange = function() {
			if (ajax.readyState == 4 && ajax.status == 200) {
				var c = ajax.responseText;
				alert(c);
			}
		}

二、JQuery封装的Ajax请求

  • JQUERY把原生提供为方法,不需要将JSON字符串转换为JSON对象;get与post方法的区别在于只需要修改type即可。

  • 设置console.log(error),通过检查元素—>控制台—>点击发送ajax请求—>查看错误信息的代码来查看后台返回的信息

get请求代码如下:

$('button').click(function() {
		//发送Ajax
		$.ajax({
			type: 'get',
			url: 'https://autumnfish.cn/api/joke/list555',
			//请求参数
			data: {
				'num': '2'
			},
			//请求成功之后的回调
			success: function(res) {
				//res 返回的结果,JQuery 已经把返回的JSON字符串,已经转换成了JSON对象。
				alert(res.msg);
				alert(res.jokes[0]);
			},
			//请求失败之后的回调
			error: function(error) {
				//console.log(error);
				//console.log(error.status);
				alert(error.status);
				alert(error.statusText);
			},
			dataType: 'json' //接收后台返回的数据类型
		});

	})

post请求代码如下:此处后台为自己写的后台

$('button').click(function() {
		//发送Ajax
		$.ajax({
			type: 'post',
			url: 'http://localhost:8080/login',
			//请求参数
			data: {
				'username': '王五',
				'password': '888888'
			},
			//请求成功之后的回调
			success: function(res) {
				//res 返回的结果,JQuery 已经把返回的JSON字符串,已经转换成了JSON对象。
				alert(res.username);
				alert(res.password);
			},
			//请求失败之后的回调
			error: function(error) {
				alert(error.status);
				alert(error.statusText);
			},
			dataType: 'json' //接收后台返回的数据类型
		});
	})

三、JQuery中的get请求与post请求

  • 为了更加简便,JQuery提供了get方法与post方法,就省略了写type的内容。

$ .get():发送get请求

语法:$.get(url, [data], [callback], [type])

参数:

  				url:请求路径
   				data:请求参数(参数在url中已经写了可以不用写)
   				callback:回调函数
   				type:响应结果的类型 

post方法与get方法语法相同。data处不可省略。

$.post():发送post请求

语法:$.post(url, [data], [callback], [type])

参数:

url:请求路径
data:请求参数
callback:回调函数
type:响应结果的类型

get方法代码如下:

	$('button').click(function(){
		$.get('https://autumnfish.cn/api/joke/list?num=1',function(res){
			alert(res.msg);
		},"json");
	})

post方法代码如下:

$('button').click(function() {
		$.post('http://localhost:8080/login', {
			'username': '王五',
			'password': '888888'
		}, function(res) {
			alert(res.username);
			alert(res.password);
		}, "json");
	})

四、JQuery中的getJSON方法与postJSON方法

比get方法与post方法更加简洁,返回JSON数据类型不需要再写返回数据类型。
直接请求JSON数据,post,get请求都可以
$.getJSON(url, [data], [callback])
$postJSON(url, [data], [callback])
url:请求路径
data:请求参数
callback:回调函数

$('button').click(function() {
		$.getJSON('https://autumnfish.cn/api/joke/list?num=1',function(res){
			alert(res.msg);
		});
	})

五、Ajax跨域请求问题

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制
跨域是a页面想要获取b页面资源,如果a,b页面的协议、域名、端口号、子域名不同,所进行的访问都是跨域的,而浏览器一般为了安全都限制了跨域访问,也就是不允许跨域访问资源
1.同源策略含义
1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。
最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。
!协议相同
!域名相同
!端口相同

http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 调用http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。

2.同源策略目的
是为了保证用户信息的安全,防止恶意的网站窃取数据

设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言

3.同源策略限制范围 跨域会阻止什么操作?
浏览器是从两个方面去做这个同源策略的,一是针对接口的请求,二是针对Dom的查询
如果非同源,共有三种行为受到限制
(1) Cookie、LocalStorage 和 IndexDB 无法读取
(2) DOM 无法获得
(3) AJAX 请求不能发送
跨域的解决的方式:

1.jsonp 只支持get请求的跨域解决
jsonp:解决跨域的原理是什么?
jsonp,就是利用了某些html标签,在进行跨域请求时,不受同源策略的限制。
例如 img script;

  • JSONP是一个非官方协议,它允许在服务器端集成script tags返回至客户端,通过javascript callback的形式实现跨域访问。

  • 基本思想:网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源策略限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来

JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小,需要目标服务器配合一个callback函数

原生实现: 现在访问一个后台接口为:https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13259141515
其中后台返回的数据形式如下:
{
mts:‘1325914’,
province:‘陕西’,
catName:‘中国联通’,
telString:‘13259141515’,
areaVid:‘30503’,
ispVid:‘137815084’,
carrier:‘陕西联通’
}
前台需要写一个回调函数来处理后太返回的数据,回调函数名需要与访问后台接口的参数callback对应的参数名一致。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<button type="button" onclick="send()">jsonp请求</button>
	</body>
</html>
<script type="text/javascript">
		// 回调函数 击出省市名
		function getData(res){
			alert(res.province);
		}
</script>

<script src="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13259141515&callback=getData"></script>

JQuery通过ajax实现的方式如下:

  • Jsonp会自动生成默认回调函数,也可以指定JSONP回调的函数名,服务器收到请求后,将数据放在一个指定名字的回调函数里传回来,如果回调函数不指定名字,数据就放到默认的回调函数中
  • 此代码先执行指定自定义的回调函数"getJsonData",跨域成功后再执行alert(res.catName);
  • 如果没有指定回调函数名,数据就放到默认的回调函数中,跨域成功就执行alert(res.catName);
//服务器收到请求后,将数据放在一个指定名字的回调函数里传回来
function getJsonData(res) {
		alert(res.province);
	}

	$('button').click(function() {
		$.ajax({
			type: "GET",
			url: "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm",
			data: {
				tel: "13259141515"
			},
			//多了这个 
			jsonp: "callback", //发送jsonp 请求 回调函数名Jqurey会自动生成 
			//指定jsonp的回调函数
			jsonpCallback:"getJsonData",//可以指定JSONP回调的函数名
			success: function(res) {
				alert(res.catName);
			},
			//数据类型jsonp 
			dataType: "jsonp"
		});

JSONP类型访问getJSON实现方法如下:没有指定回调函数名,数据就放到默认的回调函数中,跨域成功就执行alert(res.catName);

$.getJSON("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13259141515&callback=?", function(res) {
			alert(res.catName);
		}); 
	

2.cors 解决,推荐的解决方式
当前浏览器发现这次Ajax请求是跨域请求时,
浏览器会通过一个请求头Origin 告诉服务器这次请求是一个跨域请求,期待你的回答。
服务器默认都会处理,跨域请求。并且给出响应,但是默认服务器默认没有对于跨域给出一个明确的表示。
也就是服务器没有设置 Access-Control-Allow-Origin 导致浏览器,不知道服务器的明确表态,所以就拦截了。
默认浏览器就会把服务返回的数据劫持了。

Origin:http://127.0.0.1:8848
Access-Control-Allow-Origin:

相关标签: Web

上一篇: jQuery中的AJAX请求

下一篇: urllib