跨域请求的实现

跨域请求的实现

1、原生跨域

  1. 使用script标签的scr属性发送请求
  2. 在服务器端设置指定类型的字符串, 返回的字符串需要拼接为函数调用的形式,真正传输的数据作为函数调用的实参
  3. 在发送请求的script标签之前声明对应的函数,并设置对应的形参,用于接收服务器返回的数据

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- <h1 οnclick="demo()">js执行函数</h1> -->
    <script>
    function demo(data) {
        console.log('this is demo');
        console.log(data);
    }
    </script>
    <script src="http://localhost:3001/getMsg?name=zhangsan&sex=nan"></script>
    <!-- <script src="js/xxoo.js"></script> -->
</body>
</html>

server.js:

if (file_path == '/getMsg' && req.method.toLowerCase() == 'get') {
	console.log('get请求触发了');
	
	res.end('demo(' + JSON.stringify({
		err: 0,
		data: {
			name: 'getMsg',
			port: 3001
		}
	}) + ')')
	return;
}

2、jquery中的jsonp

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>index.html</h1>
    <script src="js/jquery.js"></script>
    <script>
    // 发送ajax请求
    $.ajax({
        url: 'http://localhost:3001/getMsg',
        method: 'get',
        dataType: 'jsonp',
        success: function(data) {
            console.log(data);
        }
    })
    </script>
</body>
</html>

server.js

if (file_path == '/getMsg' && req.method.toLowerCase() == 'get') {
	console.log('get请求触发了');
	// 获取callback对应的值
	var callback = url_obj.query.callback;
	console.log(callback);
	res.end(callback + '(' + JSON.stringify({
		err: 0,
		data: {
			name: 'getMsg',
			port: 3001
		}
	}) + ')')
	return;
}

封装jsonp

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>封装jsonp</title>
</head>
<body>
    <script>
    function JSONP(url, data, callback) {
        // 拼接query字符串
        var str = '';
        // 遍历数据对象
        for (var i in data) {
            str += '&' + i + '=' + data[i];
        }
        // 去除对于的&
        str = str.slice(1);
        // 拼接请求路径
        url += '?' + str;
        // 创建script元素
        var script = document.createElement('script');
        // 设置src属性
        script.src = url;
        // 让script元素上树
        document.body.appendChild(script);
        // 创建jsonp回来之后执行的函数
        window[data.callback] = function(res) {
            callback(res);
            // 将script标签删除
            document.body.removeChild(script);
            // 删除掉设定的函数
            delete window[data.callback];
        };   
    }
    JSONP('http://localhost:3001/getJsonp', {name: '莉莉', sex: '男', callback: 'xxoo'}, function(data) {
        if (data.err) {
            // 失败的时候
            console.log(data.msg);
        } else {
            // 成功的时候
            console.log(data.msg);
        }
    });

    </script>
</body>
</html>

3、服务器端设置

/************************设置接口*************************/ 
if (file_path == '/getMsg' && req.method.toLowerCase() == 'get') {
	// 服务器端跨域的设置
	res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3002');
	res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
	res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
	res.setHeader('Access-Control-Allow-Credentials', 'true');

	res.end(JSON.stringify({
		err: 0,
		data: {
			name: 'getMsg',
			port: 3001
		}
	}))
	return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值