js网络编程

目录

  • AJAX
    • XHR
      • 创建AJAX请求
      • GET和POST传递参数
      • XHR的state
      • 其他事件监听
      • 响应数据和响应类型
      • http的状态码
      • 超时时间
      • 封装自己AJAX函数
    • Axios
      • 创建Axios请求实例
      • 请求和响应拦截器
    • Fetch
      • Fetch与XHR的区别
      • Fetch数据的响应
      • 发送Fetch请求
  • 封装Axios

AJAX

AJAX异步JavaScript 和 XMLAsynchronous JavaScript And XML
在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是AJAX
AJAX本身不是一种新技术,而是将现有技术结合起来的方法
具体来说,实现AJAX有两种方式

XHR

第一种则是通过XHR
XHRXMLHTTPRequest,这是一个用于网络请求的对象,我们可以用它来发送和接收JSONXMLHTMLTEXT等类型的数据

创建AJAX请求

创建一个AJAX请求通常分为四步

  1. 创建XMLHTTPRequest
    const XHR = new XMLHttpRequest()
    
  2. 监听onreadystatechange事件,这个事件将会在网络请求状态每次改变后执行
    XHR.onreadystatechange = function() {console.log("状态发生了改变");
    }
    
  3. 通过open方法配置网络请求
    XHR.open("get","")
    
    open方法接收三个参数,第一个参数是请求类型,如getpostdelete等等,第二个参数为向其发送请求的URL,第三个参数为布尔类型的可选参数,表示是否为异步操作,默认为true
  4. 调用send方法发送请求
    XHR.send()
    

GET和POST传递参数

通过GET请求来传递数据只能通过query参数

XHR.open("get","http://localhost:8088/get?name=zhangsan&age=18")
XHR.send()

事实上GET请求并不适合传递数据,如果想要大量传递数据需要使用POST请求

  1. POST请求通过表单传递数据
    const form = document.querySelector("form")
    const formData = new FormData(form)
    XHR.open("post","http://localhost:8088/post")
    XHR.send(formData)
    
  2. 通过设置请求头application/x-www-form-urlencoded的方式
    XHR.open("post","http://localhost:8088/post")
    const data = "name=zhangsan&age=18"
    XHR.setRequestHeader("Content-type","application/x-www-form-urlencoded")
    XHR.send(data)
    
  3. 通过设置请求头application/json的方式
    XHR.open("post","http://localhost:8088/post")
    const data = JSON.stringify({name:"zhangsan",age:18})
    XHR.setRequestHeader("Content-type","application/json; charset=utf-8")
    XHR.send(data)
    

XHR的state

在一次网络请求中XHR的状态会发生很多次变化
我们可以在onreadystatechange事件中通过XHR.readyState拿到每次状态变化的值

状态码意义
0请求被创建,但未调用open方法
1open方法被调用
2send方法被调用,并且头部和状态已可取得
3下载中
4下载操作已完成

其他事件监听

事件名作用
loadstart请求开始
progress第一个响应数据包到达
abort调用了XHR.abort()取消了请求
error发生连接错误
load请求完成
timeout请求超时,前提是设置了timeout
loadend在load、error、timeout、abort之后触发

响应数据和响应类型

发送了请求过后我们可以通过response属性来获取返回的数据

const res = XHR.response

返回数据的类型则是由responseType来决定

XHR.responseType = "json"

如果responseType值为空则为默认值text
responseText返回的是text数据
responseXML返回的则是XML
在早期的服务器中返回的数据多是textXML,所以那时多用responseTextresponseXML来获取结果
现在服务器返回多为json数据

http的状态码

除了请求有状态码之外,响应也有对应的状态码
我们可以通过statusstatusText来获取

const status = XHR.response.status;
const statusText = XHR.response.statusText;

具体关于HTTP响应码相关的内容可以看我这篇文章
前端网络基础

超时时间

为了避免过长的网络请求时间而服务器迟迟无法返回数据的情况,我们可以设置一个超时时间
当达到设置的时间后如果还没能拿到数据则会自动取消这个请求
默认值为0,表示没有设置超时时间
timeout的单位为毫秒

XHR.timeout = 10*1000

封装自己AJAX函数

function AJAX({method,url,asy = true,timeout = 0,data = {},success,failure
}) {const xhr = new XMLHttpRequest();xhr.responseType = "json"xhr.timeout = timeoutxhr.onload = function () {if (xhr.status == 200) {success(xhr.response)} else {failure(xhr.status, xhr.statusText)}}if (method || url || success || failure) {throw new Error("未传入指定参数")return;} else if (method.toLowerCase() == "get") {let query = []for (const key in data) {query.push(`${key}=${data[key]}`)}url = url + "?" + query.join("&")xhr.open(method, url, asy)xhr.send()} else if (method.toLowerCase() == "post") {xhr.open(method, url, asy)xhr.setRequestHeader("Content-type", "application/json")xhr.send(JSON.stringify(data))} else {throw new Error("不支持这种方法")}return xhr;
}const xhr = AJAX({method: "get",url: "http://localhost:8088/get",data: {name: "zhangsan"},success: function (res) {console.log(res)},failure: function (status, statusText) {console.log(status, statusText)}
})

Axios

Axios是一个基于promise的网络请求库
它不仅可以在浏览器里发送网络请求,还可以在node.js中发送请求
它还支持Promise
请求/响应拦截器等等

创建Axios请求实例

当我们从Axios中导入对象时使用的实例为默认实例
有时候默认实例的配置并不是我们所需的
所以我们可以创建一个新的实例并传入属于该实例的配置

const ajax = axios.create({baseURL:"http://localhost:8088"	
})

通过我们创建的这个实例来发送请求

ajax.get("/get",{params:{}
}).then(res=>{console.log(res)
})ajax.post("/post",{name:"zhangsan",age:19}
}).then(res=>{console.log(res)
})

请求和响应拦截器

Axios也可以设置拦截器,拦截每次请求和响应
请求拦截

axios.interceptors.request.use(function (config) {console.log("请求成功拦截")return config;}, function (error) {console.log("请求失败拦截")return error;});

响应拦截

axios.interceptors.response.use(function (response) {console.log("响应成功拦截")return response;}, function (error) {console.log("响应失败拦截")return error;});

Fetch

Fetch是一种更加现代的网络请求方案
它是早期XMLHTTPRequest的替代方案
同样也是AJAX的另一种实现方式

Fetch与XHR的区别

XHR不同的是

  1. Fetch返回值是一个Promise
  2. Fetch不像XHR一样所有操作都在一个对象上
  3. XHR在上传文件时可以监控进度,Fetch不行

Fetch数据的响应

Fetch将数据的响应分成了两个阶段
服务器返回了数据时为第一个阶段

  1. 在这个阶段我们可以通过检查http响应头来判断请求是否成功
  2. 如果因为网络问题,url不正确等导致Fetch无法建立http请求,那么Promise就会reject
  3. http响应码404,500异常状态码时将不会导致error
  4. 我们可以通过response.status来获得http状态码

第二个阶段为我们通过其他方法获取数据

  1. response.text()
    文本的形式返回
  2. response.json()
    json的形式返回

发送Fetch请求

发送get请求

async function getData() {const response = await fetch("http://localhost:8088/get")const data = await response.json()console.log(data)
}

发送post请求

const params = {name:"zhangsan",age:18
}
async function getData() {const response = await fetch("http://localhost:8088/get",{method:"post",headers:{"Content-type", "application/json; charset=utf-8"},body:JSON.stringify(params)})const data = await response.json()console.log(data)
}

封装Axios

我们可以基于Axios简易封装一个自己的网络请求库

async function httpGet(url, params) {const request = await axios.get(url, {params})return request
}
async function httpPost(url, data) {const request = await axios.post(url, data)return request
}axios.interceptors.request.use(function(config) {return config;
}, function(error) {return Promise.reject(error);
});axios.interceptors.response.use(function(response) {return response;
}, function(error) {return Promise.reject(error);
});export {httpGet,httpPost
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring面试题11:什么是Spring的依赖注入

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的依赖注入 依赖注入(Dependency Injection)是Spring框架的一个核心特性,它是指通过外部容器将对象的依赖关系注入到对象中,从而…

M-LAG协议交互原理

介绍M-LAG的实现原理。 基于M-LAG组成的双活系统提供了设备级的可靠性,那么M-LAG是如何建立的?如图1所示,M-LAG的建立过程有如下几个步骤: DFS Group配对 当M-LAG两台设备完成配置后,设备首先通过peer-link链路发送DF…

论文阅读-Group-based Fraud Detection Network on e-Commerce Platforms

目录 摘要 1 Introduction 2 BACKGROUND AND RELATED WORK 2.1 Preliminaries 2.2 Related Works 3 MODEL 3.1 Structural Feature Initialization 3.2 Fraudster Community Detection 3.3 Training Objective 4 EXPERIMENT 4.1 Experimental Setup 4.2 Prediction …

laravel 阿里云短信发送

示例 一、安装 安装:composer require mrgoon/aliyun-sms dev-master 二、打开config/app.php,添加配置代码 1、‘providers’ 配置组下添加 Mrgoon\Aliyunsms\AliyunsmsServiceProvider::class, 2、‘aliases’ 配置组下添加 Aliyunsms>Mrgoon…

【力扣】13. 罗马数字转整数

题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符数值I1V5X10L50C100D500M1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写…

OpenWrt 学习记录

OpenWrt 学习记录 ssh settingCodePathreview MakefileCURDIRMAKEFILE_LIST ssh setting keygenssh-keygen -t rsa -C "hughwin10WLS.com"copy rsa_pub to gitee sshcat id_rsa id_rsa.pub打开gitee仓库,点击头像、点击设置,点击SSH公钥&…

基于C/C++的共享内存的创建和使用(Linux)

流程: 生成一个key值(函数:ftok)创建共享内存,返回一个共享内存id(函数:shmget)映射共享内存,关联的到当前进程,得到虚拟地址(函数:shmat)使用内存,此时操作shmat函数返回的指针就是…

记一次STM32F4 HAL IAP开发过程踩坑

第一次在HAL库上做IAP,不太熟悉库结构,被坑了一早上… MCU上做了一个shell,实现了goto命令跳转到APP区执行(只是为了开发时方便)。跳转到APP前和以前一样清理了所有初始化过的外设,也对中断进行了处理&…

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础 第19章 QML编程基础19.1 QML概述19.1.1 第一个QML程序19.1.2 QML文档构成19.1.3 QML基本语法 19.2 QML可视元素19.2.1 Rectangle(矩形)元素19.2.2 Image(图像)元素19.2.3 Text&#xf…

spring和springmvc常用注解

1.Spring常用注解: 1)Repository将DAO类声明为Bean 2)Service用于修饰service层的组件 3)Controller通常作用在控制层,将在Spring MVC中使用 4)Component是一个泛化的概念,仅仅表示spring中的一…

机器人如何有效采摘苹果?

摘要:本文利用动捕数据构建拟人运动模型,对比观察两种苹果采摘模式,并对系统性能进行全面评估,为提高机器人采摘效率提供创新方法。 近期,一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…

linux 编译安装 opencv 和指定 opencv_contrib 库

1. 下载 opencv 和对应版本的 opencv_contrib 库 opencv:https://opencv.org/releases/opencv_contrib:https://github.com/opencv/opencv_contrib 2. 使用 cmake 编译 opencv 和指定 opencv_contrib 库 # 在 opencv 源码文件夹下创建并进入 build 文…

rust学习-rpc

使用框架rpcx-rs rpcx-rs 0.2.2 版本,使用Rust访问rpcx服务,支持 JSON 和 MessagePack 两种序列化方式。 protobuf序列化的支持、服务治理各种功能(路由、失败处理、重试、熔断器、限流)、监控(metrics、trace)、注册中心(etcd、consul)等众多的功能 cat ../Cargo.toml [pa…

MR混合现实情景实训教学

MR混合现实技术是一种将虚拟现实与现实场景相融合的创新技术,可以广泛应用于各个领域。其中,混合现实情景实训教学是MR技术的一个重要应用场景。 在医学专业方面,医学生常常需要通过实际操作来提升自己的技能水平,然而传统的实训方…

Vue 使用SignalR.JS与Microsoft.AspNetCore.SignalR实时通讯

针对于Web与其他应用的的通讯,在.Net中,SignalR是一个不错的选择,在前后端没有分离的时候,直接引用对应的signalr.js文件即可; 这里主要记录Vue与Asp.netcore 前后端分离通过signalR通讯实践; 服务端即Asp.…

【完美解决】GitHub连接超时问题 Recv failure: Connection was reset

问题: 已经开了梯子但是在Idea中使用git(GitHub)还是连接超时Recv failure: Connection was reset。此时需要让git走代理。 解决方案: 1.对右下角网络点击右键 -> 打开网络和Internet设置 2.代理 -> 查看到地址和端口号…

图像处理之《基于语义对象轮廓自动生成的生成隐写术》论文精读

一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像,然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像,通过信道传输后再利用算法的逆过程提出秘密信息。而生…

React中的受控组件(controlled component)和非受控组件(uncontrolled component)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 组件⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是…

【jmeter】jmeter引用变量,变量值传递失败

最近在用jmeter做接口测试的时候,发现有个变量,参数值一直没有传递进来,导致request的时候,请求体里面一直是${}变量的形式。 后来经过排查发现,是因为我在定义用户变量的时候,在这个now后面多加了一个空格…

ps[001] 初学创建剪切蒙版

前置条件:PS2020版本 技能应用:ps 海报标题和图片结合 1、画布1300*1300像素,altdel设置背景为前景色 2、准备一张绿色的海报,可以百度宫崎骏,找张绿色的图片就可以了 3、拉个文字款,写个SUMMER英文体&a…