Ajax解决跨域--JSONP原理

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax解决跨域--JSONP原理相关的知识,希望对你有一定的参考价值。

1.解决跨域–JSONP


1.1 JSONP 是什么

JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明 才智开发出来,只支持 get 请求。


1.2 JSONP 怎么工作的?

  • 在网页有一些标签天生具有跨域能力,比如:img link iframe script。
  • JSONP 就是利用 script 标签的跨域能力来发送请求的。
<!-- 我们在script中可以引入第三方库, 说明script标签是支持跨域的 -->
<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script>

1.3 JSONP 的使用

项目的文件结构:


app.js

const data ={
    name: "YanFang"
}

console.log(data);

ajaxDemo.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原理演示</title>
    <style>
        #result {
            width: 300px;
            height: 100px;
            border: solid 1px #78a;
        }
    </style>
</head>

<body>
    <div id="result"></div>

</body>
<script src="./js/app.js"></script>

</html>

我们使用Open with Live Server来打开

使用这个URL来替换 ./js/app.js

发现现在也是可以访问app.js的

我们现在想要把app.js的name值放在网页当中

app.js

const data ={
    name: "YanFang"
};

handle = (data)=>{
   document.getElementById('result').innerText=data.name
}

handle(data);

我们现在把handle()函数放在HTML文件里面,app.js只负责调用函数

ajaxDemo.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原理演示</title>
    <style>
        #result {
            width: 300px;
            height: 100px;
            border: solid 1px #78a;
        }
    </style>
</head>

<body>
    <div id="result"></div>
    <script>
        handle = (data) => {
            document.getElementById('result').innerText = data.name
        }
    </script>
    <script src="http://127.0.0.1:5500/ajax/js/app.js"></script>
</body>

</html>

app.js

const data ={
    name: "YanFang"
};

handle(data);

安装express

npm i express

server.js

//1. 引入express
const express = require('express');

//2. 创建应用对象
const app = express();
 
//3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

//jsonp服务
app.all('/jsonp-server',(request, response) => {
    // response.send('console.log("hello jsonp")');
    const data = {
        name: '🐟🐟🐟'
    };
    //将数据转化为字符串
    let str = JSON.stringify(data);
    //返回结果
    response.send(`handle(${str})`);
});

//4. 监听端口启动服务
app.listen(8080, () => {
    console.log("服务已经启动, 8080 端口监听中....");
});

启动服务 nodemon server.js

ajaxDemo.html

现在的运行结果:




以上是关于Ajax解决跨域--JSONP原理的主要内容,如果未能解决你的问题,请参考以下文章

转JS跨域(ajax跨域iframe跨域)解决方法及原理详解(jsonp)

前端 - jsonp 跨域ajax

转Php+ajax+jsonp解决ajax跨域问题

ajax使用jsonp解决跨域问题

ajax基础4--什么是跨域以及如何解决跨域

关于ajax跨域的一些解决方案