# Ajax **Repository Path**: qiang-xiaoyue/ajax ## Basic Information - **Project Name**: Ajax - **Description**: 学习路上的代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-07 - **Last Updated**: 2023-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Ajax ## README # 学习 ## Ajax 根据B站up主 尚硅谷的Ajax教程学习整理 [【尚硅谷】3小时Ajax入门到精通](https://www.bilibili.com/video/BV1WC4y1b78y/?spm_id_from=333.337.search-card.all.click&vd_source=b0c96212c6cbc6032300f011d1554de7)   [菜鸟教程](https://www.runoob.com/ajax/ajax-tutorial.html) ### node.js 和 express 1. node.js 运行在服务端的JavaScript
2. express 基于nodeJS快速开发、极简的平台 #### node.js 和 express 搭建一个服务端 ``` const express = require("express"); const app = express(); const port = 8000; app.listen(port, () => { console.log("服务已启动,8000端口正在被监听..."); }); app.get("/", (request, response) => { //设置跨域 response.setHeader("Access-Control-Allow-Origin", "*"); //设置相应体 response.send("我是首页"); }); ``` ### 原生Ajax 格式: > const xhr = new XMLHttpRequest();
xhr.open("GET/POST", "URL");
xhr.send();
//设置数据格式 xhr.responseType = "json"; xhr.onreadystatechange = function(){}; #### 服务端返回json格式数据 ``` //数据 const str = { name: "张三", age: "20", }; //转换成JSON数据 var data = JSON.stringify(str); //返回JSON数据 response.send(data); ``` #### POST请求 > js代码: ``` ``` > 服务端代码: ``` const express = require("express"); const app = express(); const port = 8000; app.listen(port, () => { console.log("服务已启动,8000端口正在被监听..."); }); app.post("/one", (request, response) => { //设置跨域 response.setHeader("Access-Control-Allow-Origin", "*"); response.send(" 我是返回的东西 POST "); }); ``` #### GET请求 > js代码: ``` ``` > 服务端代码: 大致同POST,app.get ### 使用JQuery 中的AJAX请求 1. 引入JQuery 2. $.post $.get $.ajax ``` ``` ### 使用Axios 发送Ajax请求 1. 引入Axios [Axios文档](https://www.axios-http.cn/docs/intro) 2. axios.get().then() axios.post().then() axios({}).then() ``` ``` ### 同源政策 跨域问题 > 同源政策:协议、主机、端口号,三者要相同 1. 后端解决跨域问题 > response.setHeader("Access-Control-Allow-Origin", "*"); //请求源
response.setHeader("Access-Control-Allow-Methods", "*"); //请求方式
response.setHeader("Access-Control-Allow-Headers", "*"); //请求头 ``` app.all("/one_JSON", (request, response) => { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); //数据 const str = { name: "张三", age: "20", }; //转换成JSON数据 var data = JSON.stringify(str); //返回JSON数据 response.send(data); }); ``` 2. 前端用 jsonp解决跨域问题 * 什么是jsonp:
> 为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了 * jsonp 和 ajax 的区别: > 1. ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jQuery和ext等框架都把jsonp作为ajax的一种形式进行了封装; > 2. ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加script标签来调用服务器提供的js脚本。 > 3. 其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。 > 4. jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。 > 总而言之,jsonp不是ajax的一个特例,尽管jquery等把jsonp封装进了ajax,也不能改变这一点。 #### 代码: > html部分: ```
用户名:

``` > 服务端部分: ``` app.all("/jsonp", (request, response) => { //没有设置跨域,客户端用jsonp来解决,返回一个had()函数带参数。 let data = { exists: 1, msg: "用户已存在", }; let str = JSON.stringify(data); response.end(`had(${str})`); }); ```