Ajax-使用教程

运行环境

ajax一定的是运行在网站服务器里面,因此你需要自己配置nodejs服务器

导学:传统的问题还有代理人ajax

传统的http中是又浏览器来做。它在发生和响应的时候网页是不能进行其他操作的
而ajax是一个中间人

Ajax-使用教程_第1张图片

简单的使用

XMLHTTPRequest是一个内置构造函数,我们创建衣这个的实例就是在创建这个代理人

new 对象

告诉ajax请求的方式还有地址

发送请求

获取服务端的回送数据没注意,当对象的onlad就是加载完之后 我们给一个回调来处理数据
数据哪儿来的?是对象下面的responeText来的

Ajax-使用教程_第2张图片

创建一个html页面
01XXX.HTML在这个页面写一个ajax并且向服务器拿数据

  

然后我们去服务器端配置出来
注意:服务器列举了一些顺序 你必须要做的
app.js

// 1. 引入express框架
const express = require('express');
// 2. 路径处理模块
const path = require('path');


// 3. 创建web服务器 
const app = express();



// 4. 静态资源访问服务功能,user方法 拦截调所有的请求,如何用框架的static静态方法,把文件请求到向我们的指定的目录,我们的文件夹定义为了public
app.use(express.static(path.join(__dirname, 'public')));



/* 6 开始设置各种设置各种路由 */
// 对应01html文件
// 6.1 创建第一个响应的数据: app.get(参数1:路由地址,参数2:服务器的响应函数)
app.get('/first', (req, res) => {
    //这个意思就send'发回去
    res.send('Hello, Ajax');
});


// 5.监听端口
app.listen(3550);
// 控制台提示输出
console.log('服务器启动成功');

服务器返回JSON对象的情况

我们在开发的时候 服务器一般都是发生JSON对象。如何在前端使用DOM渲染数据就完事

  1. 02.XXXX.HTML这个页面用来处理服务器的json数据

注意啊,在http传输中都是字符串的形式传输的,为了在网页中使用字符串,我们需要把它转化为对象 JSON.parse( 要转化的字符串 ),返回的数据就是一个对象就完事了



  1. 服务器端
// 6.3 对应03html文件
app.get('/get', (req, res) => {
    res.send(req.query);
    // req表示的就是我们的服务器的响应,我们的query拿到的就是传递过来的值
    // console.log(req.query);
});

传递参数之——POST?如何传递

post的请求参数是放在请求体中

post必须明确的设置请求参数报文的类型,这个类型是固定的写法
当然了我们呢还有另外的一种类型。这将会在后面慢慢的讲到

在http传输的时候,发送的数据块就是报文,报文的组成是报文体还有报文头

( 参数名词=参数值,多个参数用&分割 的形式传递的数据) ===application/x-www-form-urlencoded

 

服务器端

+++
// 6.4 对应04html文件 服务器要用一个模块来接受POST请求
const bodyParser = require('body-parser');
// 6.4 对应04html文件 服务器要用一个模块来接受POST请求,这些请求的信息就存在了我们的req.body中
app.post('/post', (req, res) => {
    res.send(req.body);
    // console.log(req.body);
});
+++

传递参数之——POST,JSON 发送POST 并且发送的是json

我们的post的时候我们可以发送

( JSONl类型的报文) ===application/JSON

1.html代码

  • 我们需要设置另外的Content-type的类型。把json字符串传递给服务器
  • 注意啊我们传递的时候要把json对象转换成jsom字符串再传递

2.服务器代码

  • 我们在服务器要使用另外的方式去构造我们的服务器解析请求方式
//6.5另外的解析方式
app.use(bodyParser.json());
+++
// 6.5 对应05html文件
app.post('/json', (req, res) => {
    res.send(req.body);
    console.log(req.body);
});
+++

注意get提交不能够提交json数据提交

补充:落后的服务器响应数据的获取

原理 ajax创建的时候,使用的时候每一个过程都有一个ajax状态码。它有五个,状态 这哥时候我们就可以用这个来获取服务器数据

0.-状态码(未初始化还没有调用open()
1.-请求建立(建立了链接但是没有发就是没有调用send()
2.-请求发生完毕
3.-请求在处理中。这个时候我们的部分数据就可以用了
4.完成,获取到了服务器的响应

如何获取ajax的状态码?我们有一个redaStat方法,利用这个就可以弄好
我们还有一个事件
当ajax状态码发生变化的时候触发。我们使用这个事件就可以捕获各种状态的状态码了
onreadyStarte

代码说明 xhr.readyState获取状态码
xhr.open('get', 'http://localhost:3000/readystate');表示已经配置好了
xhr.onreadystatechange 当ajax状态发生变化的时候触发这个事件 2-3-4的状态码都在这里可以捕获 这个事件要放在send之前,

   
  • 将来我们就可以使用各种状态,来结合业务需求
// 6.7 对应07html文件
app.get('/error', (req, res) => {
    // console.log(abc);
    //这个是在服务器端的方法,设置http状态码,服务器端的状态码的可以手动更改
    res.status(400).send('not ok');
});

  • 接下里我们来看看这些状态码

400表示请求出错了 服务器给你返回了一个错误状态码

404 表示没有在服务器上找到。意思就是你没有连上服务器 这个时候你需要看一下是不是你的地址写错了

500 表示服务器内部业务逻辑出错了,通常这种事实你就要去跟后台开发人员进行反馈了

网络中断,没有网络,这个情况下我们的onlad是不会被触发的,但是我们的oneerror可以触发。这个时候你就可以用这个来做错误处理了
如何模拟断网状态?

Ajax-使用教程_第4张图片

这样你就断网了

        xhr.onerror = function() {
            alert('网络中断, 无法发送Ajax请求')
        }

区分一下http状态码还有ajax状态码

Ajax状态码: 表示Ajax请求的过程状态 ajax对象返回的
Http状态码: 表示请求的处理结果 是服务器端返回的

ajaxIE兼容性

要读取文件 node下你必须引入另一个模块处理文件读取


//6.8 读取文件的模块
const fs = require('fs');

// 6.8 对应08html文件
app.get('/cache', (req, res) => {
   
   //读取fs对象下的衣蛾读取文件的犯法。读取成功之后放回结果 通过服务器我给他加载到res里面去
   fs.readFile('./test.txt', (err, result) => {
        res.send(result);
    });
});

在ie中 是比较垃圾 有缓存问题,这个ie浏览器的问题不是我们的问题

我们的解决只需要 发生的请求每一次都随机变化就行了
xhr.open('get', 'http://localhost:3000/cache?t=' + Math.random());
注意啊 如果你的t是服务器要求的数据变量 那么你就不能用t了!!一定要注意

   
    

ajax的异步

异步ajax的发生和处理的时候都是异步的

我们只是写了一个ajax就写了怎么多代码。我们要封装 发生多次的时候就方便多了

代码比较复杂 你只需要会用就完事

/**
 * 描述
 * 
 * 
 * 
 *  使用说明:type表示请求方式有两种get还有post 
url是地址
data{}里面传递的你的请求数据 不管你是get还是post不管你是要传递json还是字符串你就给我吗用就行了
sucesscs:是成功能的函数
error:是失败之后的回调
关于返回值:放回值都在我们的回调函数里面 的responseText身上。所有你回调函数一下 直接用responseText就能拿到响应回来的所有数据了

默认值 get  头是application/x-www-form-urlencoded这种形式

注意:如果你需要状态码 你只需要在erro回调里面获取xhs.statsus还有xhs.onreddrSataius再做错误的业务处理就行
 * 
 * 
 * @date 2020-04-04
 * @param {url} 将要请求的地址
 * @param {data{} } 请求传递出去的参数
 * @param {sucesscs} 成功之后的回调
 * @param {error } 失败之后的回调
 * @returns {any}
 */

/* 使用举例
 
ajax({
          url: 'http://localhost:3550/get',//必须
           data: {//可选默认是空
               username: username.value,
               age: age.value,
           },
           header: {
               'Content-Type': 'application/x-www-form-urlencoded' //可选默认是application/x-www-form-urlencoded
           },
           success: function(data) {
               console.log(data);
           },
           error: function(data) {}
       })


*/

function ajax(options) {
    // 存储的是默认值
    var defaults = {
        type: 'get',
        url: '',
        data: {},
        header: {
            'Content-Type': 'application/x-www-form-urlencoded' //这个是默认的
        },
        success: function() {},
        error: function() {}

    };
    // 使用options对象中的属性覆盖defaults对象中的属性,assign是一个覆盖另一个对象的方法
    Object.assign(defaults, options); //默认值 get  头是application/x-www-form-urlencoded这种形式

    // 创建ajax对象
    var xhr = new XMLHttpRequest();
    // 拼接请求参数的变量
    var params = ''; //parmas是我们的请求过来的参数
    // 循环用户传递进来的对象格式参数
    for (var attr in defaults.data) {
        // 将参数转换为字符串格式
        params += attr + '=' + defaults.data[attr] + '&';
    }
    // 将参数最后面的&截取掉 
    // 将截取的结果重新赋值给params变量,拼接操作
    params = params.substr(0, params.length - 1);

    // 判断请求方式
    if (defaults.type == 'get') {
        defaults.url = defaults.url + '?' + params;
    }
    // 配置ajax对象
    xhr.open(defaults.type, defaults.url);
    // 如果请求方式为post
    if (defaults.type == 'post') {
        // 用户希望的向服务器端传递的请求参数的类型
        var contentType = defaults.header['Content-Type']
            // 设置请求参数格式的类型
        xhr.setRequestHeader('Content-Type', contentType);
        // 判断用户希望的请求参数格式的类型
        // 如果类型为json
        if (contentType == 'application/json') {
            // 向服务器端传递json数据格式的参数
            xhr.send(JSON.stringify(defaults.data))
        } else {
            // 向服务器端传递普通类型的请求参数
            xhr.send(params);
        }
    } else {
        // 发送请求
        xhr.send();
    }
    // 监听xhr对象下面的onload事件
    // 当xhr对象接收完响应数据后触发
    xhr.onload = function() {
        // xhr.getResponseHeader()
        // 获取响应头中的数据
        var contentType = xhr.getResponseHeader('Content-Type');
        // 服务器端返回的数据
        var responseText = xhr.responseText;
        // 如果响应类型中包含applicaition/json,服务器在响应的时候会在响应头附上响应的数据类型

        //includes就是坚持字符串是否包含某简直
        if (contentType.includes('application/json')) {
            // 将json字符串转换为json对象
            responseText = JSON.parse(responseText)
        }
        // 当http状态码等于200的时候
        if (xhr.status == 200) {
            //在这里我们也把xhr对象放回回去。让我们的回调函数,有更多的控制权

            // 请求成功 调用处理成功情况的函数
            defaults.success(responseText, xhr);
        } else {

            // 请求失败 调用处理失败情况的函数
            defaults.error(responseText, xhr);
        }
    }
}

你可能感兴趣的:(Ajax-使用教程)