AJAX 学习记录

AJAX入门

AJAX概念

MDN中的定义(AJAX - MDN Web 文档术语表:Web 相关术语的定义 | MDN (mozilla.org)):

AJAX(Asynchronous JavaScript And XML)是一种在 Web 应用中通过异步发送 HTTP 请求向服务器获取内容,并使用这些新内容更新页面中相关的部分,而无需重新加载整个页面的 Web 开发技术。这可以让网页更具有响应性,因为只请求了需要更新的部分。

概念:

        AJAX 是浏览器与服务器进行 数据通信 的技术

AJAX使用

使用AJAX 需要使用 axios库,与服务器进行数据通信

axios 使用

  1. 引入axios.js:https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js
  2. 使用 axios 函数

语法:

    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        axios({
            url:'目标资源地址'
        }).then(
            回调函数
        )
    </script>

URL

定义

统一资源定位系统(uniform resource locator,缩写:URL)

因特网万维网服务程序上用于指定信息位置的表示方法

简称 网址,用于访问网络上的资源

组成

URL由三部分组成:协议,域名,资源路径

  • 协议:超文本传输协议,规定浏览器和服务器之间传输数据的格式
  • 域名:标记服务器在互联网中方位
  • 资源路径:标记资源在服务器下的具体位置

URL查询参数

定义:浏览器提供给服务器的额外信息,让服务器返回浏览器想要的数据

语法:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2(加粗为查询参数)

查询参数的名与值,与后端沟通决定

 

在axios函数中,可以使用axios 提供的 params 选项,用于获取数据

params 选项可以帮助我们把参数拼接到 url 字符串后面

语法:

    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        axios({
            url:'目标资源地址',
            params:{
                参数名:值
            }
        }).then(
            回调函数
        )
    </script>

常用请求方法和数据提交

常用请求方法

请求方法:对服务器资源,要执行的操作

请求方法操作
GET获取数据
POST提交数据
PUT修改数据(全部)
DELETE删除数据
PATCH修改数据(全部)

接口

 接口:使用 AJAX 和服务器通讯时,使用的 URL请求方法,以及参数

数据提交

将数据上传到服务器保存

使用axios 提供的 method 选项,method可以设置 axios 请求的方法

默认为 GET ,可以省略(不区分大小写)

使用axios 提供的 data 选项,用于提交数据

语法:

    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        axios({
            url: '目标资源地址',
            method: '请求方法',
            data: {
                参数名: 值
            }
        }).then(
            回调函数
        )
    </script>

axios 错误处理

在 then 方法的后面,调用 catch 方法进行错误处理

语法:

    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        axios({
            请求
        }).then(
            回调函数
        ).catch(
            回调函数
        )
    </script>

HTTP协议 - 报文

HTTP 协议:规定了浏览器发送及服务器返回内容的 格式

请求报文

浏览器按照 HTTP 协议要求的格式,发送给服务器的内容

请求报文组成:

  1. 请求行:请求方法,URL,协议
  2. 请求头:以键值对的格式携带的附加信息,比如:Content-Type 3
  3. 空行:分隔请求头,空行之后的是发送给服务器的资源 4.
  4. 请求体:发送的资源

请求报文可以用于错误排查

 从浏览器中查看的请求报文是经过格式化的

响应报文

服务器按照 HTTP 协议要求的格式,返回给浏览器的内容

响应报文组成:

  1. 响应行(状态行):协议、HTTP 响应状态码、状态信息 
  2. 响应头:以键值对的格式携带的附加信息,比如:Content-Type 
  3. 空行:分隔响应头,空行之后的是服务器返回的资源
  4. 响应体:返回的资源

HTTP 响应状态码

用来表明请求是否成功完成

示例: 404 (服务器找不到资源)

状态码说明
1xx信息
2xx成功
3xx重定向消息
4xx客户端错误
5xx服务端错误

图片上传

思路:

  1. 先使用文件选择元素,获取文件对象
  2. 然后装入FormData表单对象中
  3. 再发送给服务器,得到图片在服务器的URL网址
  4. 最后通过img标签加载出图片

具体代码:

1.获取文件

使用type值为file的input标签来作为文件选择元素

    <!--文件选择元素-->
    <input type="file" class="test">

再对其绑定change改变事件,获取的图片文件在 e.target.files[0] 中

        document.querySelector('.test').addEventListener('change',e=>{
            console.log(e.target.files[0]);
        })

2.装入FormData表单对象

在事件中,使用FormData 携带图片文件

            const fd = new FormData()
            fd.append('img', e.target.files[0])

3.提交服务器

提交服务器后,可以获得图片的URL网址


4.获取的图片url网址,可以用img标签加载显示

AJAX原理

AJAX是对 XHR 和 Promise 相关代码进行了封装,实现了浏览器与服务器之间的通信

XMLHttpRequest

基础使用

XMLHttpRequest(以下简写为XHR)

        XHR是一个对象,用于与服务器交互。

使用XHR步骤:

  1. 创建XHR对象
  2. 配置请求方法和url地址
  3. 监听loadend事件,接收响应成果
  4. 发起请求
        //创建XHR对象
        const XHR=new XMLHttpRequest()
        //配置请求方法和url地址
        XHR.open('请求方法','url')
        //监听loadend事件,接收响应成果
        XHR.addEventListener('loadend',()=>{
            //配置函数体
            console.log(XHR.response);
        })
        //发起请求
        XHR.send()

查询参数

在原生XHR中,没有params选项将参数拼接到 url 字符串后

所以需要手动将参数拼接到 url 字符串后

http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2(加粗为查询参数)

查询参数的名与值,与后端沟通决定

数据提交

  • 原生XHR中,需要我们自行设置请求头,告诉服务器传递的数据类型
  • 传递的数据如果是JSON字符串,也需要我们自行转换
  • send方法调用需要传入请求体,发送给服务器

设置请求头,使用XHR的setRequestHeader方法,传入的内容类型与后端沟通决定

语法:

xhr.setRequestHeader('Content-Type', '内容类型')

示例:

        const xhr=new XMLHttpRequest()
        xhr.open('POST','http://hmajax.itheima.net/api/register')
        xhr.addEventListener('loadend',()=>{
            console.log(xhr.response);
        })
        //设置请求头
        xhr.setRequestHeader('Content-Type', 'application/json')
        //准备请求体数据
        const data={
            username:'zhao1005407505',
            password:'1005407505'
        }
        const Data=JSON.stringify(data)
        //发送请求体数据
        xhr.send(Data)

Promise

基本使用

Promise是一个对象,用于表示一个异步操作的最终完成(或失败)及其结构值

语法:

        //创建Promise对象,并传入一个回调函数
        const p = new Promise((resolve, reject) => {
            resolve(值)//如果成功调用,执行then(),传入值赋予result 
            reject(new error(值))如果失败调用,执行catch(),传入值赋予error
        })
        p.then(result => {
            成功回调函数
        }).catch(error => {
            失败回调函数
        })

示例:

    <script>
        //创建Promise对象,并传入一个回调函数
        const p = new Promise((resolve, reject) => {
            resolve('成功')//如果成功调用,执行then(),传入值赋予result 
            reject(new error('失败'))如果失败调用,执行catch(),传入值赋予error
        })
        p.then(result => {
            //成功回调函数
            console.log(result);
        }).catch(error => {
            //失败回调函数
            console.log(error);
        })
    </script>

Promise 状态

Promise有着三种状态

  • 待定(pending):初始状态
  • 已兑现(fulfilled):操作成功完成
  • 已拒绝(rejected):操作失败

如果是fulfilled状态,则调用 .then()

如果是rejected状态,则调用 .catch()

每个 Promise 对象一旦被兑现/拒绝,状态无法再被改变

封装简易Axios

  1. 定义 myAxios 函数,接收配置对象,返回 Promise 对象
  2. 发起 XHR 请求,默认请求方法为 GET
  3. 判断有无查询参数
  4. 调用成功/失败的处理程序
  5. 发送请求
  6. 调用 myAxios
        //1.定义 myAxios 函数,接收配置对象,返回 Promise 对象
        function myAxios(config) {
            return new Promise((resolve, reject) => {
                //2.发起 XHR 请求,默认请求方法为 GET
                const xhr = new XMLHttpRequest()
                xhr.open(config.method || 'GET', config.url)
                //3.判断有无查询参数
                if (config.params) {
                    const paramsObj = new URLSearchParams(config.params)
                    const paramsStr = paramsObj.toString()
                    config.url += '?' + paramsStr
                }
                //4.调用成功/失败的处理程序
                xhr.addEventListener('loadend', () => {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        resolve(JSON.parse(xhr.response))
                    } else {
                        reject(new Error(xhr.response))
                    }
                })
                //5.发送请求
                if (config.data) {
                    const dataJSON = JSON.stringify(config.data)
                    xhr.setRequestHeader('Content-Type', 'application/json')
                    xhr.send(dataJSON)
                } else {
                    xhr.send()
                }
            })
        }
        //6.调用 myAxios 
        myAxios({
            url: 'http://hmajax.itheima.net/api/area',
            params: {
                pname: '山东省',
                cname: '临沂市'
            }
        }).then(result => {
            console.log(result);
            p.innerHTML = result.list.join('<br>')
        }).catch(error => {
            console.log(error);
        })

axios本质上是Promise 对象,通过XMLHttpRequest对象实现功能

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值