如何在JS中使用Ajax发出请求

本人已经过原 Danny Markov 授权翻译在本教程中,我们将学习如何使用 JS 进行AJAX调用。1.AJAX术语AJAX 表示 异步的 JavaScri

大家好,今天小编来为大家解答以下的问题,关于如何在JS中使用Ajax发出请求,这个很多人还不知道,现在让我们一起来看看吧!

1.AJAX

术语AJAX 代表异步JavaScript 和XML。

JS中使用AJAX进行异步网络请求来获取资源。当然,顾名思义,资源不限于XML,还可以用于获取JSON、HTML或纯文本等资源。

有多种方法可以发出网络请求并从服务器获取数据。我们将一一介绍。

2.XMLHttpRequest

XMLHttpRequest 对象(简称XHR)在早期用于从服务器异步检索数据。

使用XML 是因为它首先用于检索XML 数据。现在,它还可以用于检索JSON、HTML 或纯文本。

事例 2.1: GET

functionsuccess(){vardata=JSON.parse(this.responseText)console.log(data)}functionerror(err){console.log(‘ErrorOccurred:’,err)}varxhr=newXMLHttpRequest()xhr.onload=successxhr .onerror=errorxhr.open(‘GET’,”https://jsonplaceholder.typicode.com/posts/1′)xhr.send() 我们看到,要发出一个简单的GET 请求,需要两个监听器来处理success 的请求和失败。我们还需要调用open() 和send() 方法。来自服务器的响应存储在responseText变量中,该变量使用JSON.parse()转换为JavaScript对象。

functionsuccess(){vardata=JSON.parse(this.responseText);console.log(data);}functionerror(err){console.log(‘ErrorOccurred:’,err);}varxhr=newXMLHttpRequest();xhr.onload=成功;xhr.onerror=错误;xhr.open(‘POST’,’https://jsonplaceholder.typicode.com/posts’);xhr.setRequestHeader(‘Content-Type’,’application/json;charset=UTF-8′); xhr.send(JSON.stringify({title:’foo’,body:’bar’,userId:1}));我们看到POST请求与GET请求类似。我们还需要使用setRequestHeader 设置请求标头“Content-Type”,并在send 方法中使用JSON.stringify 将JSON 正文作为字符串发送。

2.3 XMLHttpRequest vs Fetch

早期开发人员多年来一直使用XMLHttpRequest 来请求数据。现代fetch API 允许我们发出类似于XMLHttpRequest (XHR) 的网络请求。主要区别在于fetch() API 使用Promises,这使得API 更简单、更简洁,并避免了回调地狱。

3. Fetch API

Fetch 是用于进行AJAX 调用的本机JavaScript API。大多数浏览器都支持它,并且现在被广泛使用。

3.1 API用法

fetch(url,options).then(response={//handleresponsedata}).catch(err={//handleerrors});API参数

fetch() API 有两个参数

url是必填参数,它是你要获取的资源的路径。 options 是一个可选参数。无需提供此参数即可发出简单的GET 请求。方法: 获取|发布|放置|删除| PATCHheaders: 请求头,如{ “Content-type” : “application/json; charset=UTF-8” }mode: cors |没有cors |同源|默认| 导航缓存:重新加载| no -cachebody: 一般用于POST请求API返回Promise对象

如何在JS中使用Ajax发出请求

fetch() API 返回一个Promise 对象。

如果出现网络错误,它将被拒绝,该错误在.catch() 块中处理。如果服务器的响应带有任何状态代码(如200、404、500),则承诺将得到解决。响应对象可以在.then() 块中处理。错误处理

请注意,对于成功的响应,我们期望状态代码为200(正常状态),但即使响应带有错误状态代码,例如404(未找到资源)和500(内部服务器错误),提取的状态() API 也已解决,我们需要在.then() 块中显式处理这些。

我们可以在响应对象中看到HTTP状态:

HTTP 状态代码,例如200。 ok 布尔值,如果HTTP 状态代码为200-299,则为true。

3.3 示例:GET

constgetTodoItem=fetch(‘https://jsonplaceholder.typicode.com/todos/1′).then(response=response.json()).catch(err=console.error(err));getTodoItem.then(response=console .log(response));Response{userId:1,id:1,title:’delectusautautem’,completed:false}上面的代码:中有两点需要注意

fetch API 返回一个Promise 对象,我们可以将其分配给变量并稍后执行。我们还必须调用response.json()将响应对象转换为JSON错误处理

我们来看看当HTTP GET 请求抛出500 错误时会发生什么:

fetch(‘http://httpstat.us/500’)//thisAPIthrow500error.then(response=()={console.log(‘Insidefirstthenblock’);returnresponse.json();}).then(json=console.log(‘Insidesecondthenblock) ‘,json)).catch(err=console.error(‘Insidecatchblock:’,err));InsidefirstthenblockInsidecatchblock:SyntaxError:UnexpectedtokenIinJSONatposition4 我们看到,即使API抛出500错误,仍然会先进入then()块,其中block 无法解析错误JSON 并抛出catch() 块捕获的错误。

这意味着如果我们使用fetch() API,我们需要像这样显式处理此类错误:-

fetch(‘http://httpstat.us/500’).then(handleErrors).then(response=response.json()).then(response=console.log(response)).catch(err=console.error(‘Insidecatchblock:’ 10 fetch(‘https://jsonplaceholder.typicode.com/todos’,{method:’POST’,body:JSON.stringify({completed:true,title:’newtodoitem’,userId:1}),headers:{‘内容类型’:’application/json;charset=UTF-8′}}).then(response=response.json()).then(json=console.log(json)).catch(err=console.log(err))Response{completed:true,title:’newtodoitem上面代码中需要’,userId:1,id:201} 注意两点:-

POST 请求与GET 请求类似。我们还需要在fetch() API 的第二个参数中发送method、body 和headers 属性。我们必须使用JSON.stringify() 将对象转换为字符串请求体参数

3.3 示例:POST

Axios API 与fetch API 非常相似,但有一些改进。我个人更喜欢使用Axios API 而不是fetch() API,原因如下:

为GET请求提供axios.get(),为POST请求提供axios.post()等提供不同的方法,这使得我们的代码更加简洁。将响应代码(例如404、500)视为可以在catch() 块中处理的错误,因此我们不需要显式处理这些错误。它提供了对IE11 等旧浏览器的向后兼容性它以JSON 对象的形式返回响应,因此我们不需要进行任何解析

4.Axios API

//在chrome 控制台中引入脚本的方法varscript=document.createElement(‘script’ ); script.type=’text/javascript’;script.src=’https://unpkg.com/axios/dist/axios.min.js’;document.head.appendChild(script);axios.get(‘https://jsonplaceholder.typicode.com/todos/1′).then(response=console.log(response.data)).catch(err=console.error(err));Response{userId:1,id:1,title:’delectusautautem’,completed:false}我们可以看到是的,我们直接使用response来获取响应数据。与fetch() API 不同,数据没有任何解析对象。

错误处理

axios.get(‘http://httpstat.us/500’).then(response=console.log(response.data)).catch(err=console.error(‘Insidecatchblock:’,err));Insidecatchblock:Error:NetworkError 我们还看到500 错误由catch() 块捕获,与fetch() API 不同,我们必须显式处理它们。

用户评论

如何在JS中使用Ajax发出请求
南宫沐风

这篇文章太棒了!我一直在想办法使用 Ajax 进行请求,终于明白了步骤!以前总是觉得异步操作很复杂,现在看着你的解释,简直明明白白,感谢你的讲解!

    有15位网友表示赞同!

如何在JS中使用Ajax发出请求
咆哮

Ajax 的应用场景确实很多,比如更新网页内容、获取数据等等。你的文章解释得很详细,让我对 Ajax 理解更深了,以后可以直接参考来解决实际问题。

    有9位网友表示赞同!

如何在JS中使用Ajax发出请求
打个酱油卖个萌

之前也学过一些关于 JavaScript 的东西,但对于 Ajax 还是一头雾水。幸好你写这篇文章,把 Ajax 的原理和用法都简单明了的介绍了一遍,真的很有帮助!

    有15位网友表示赞同!

如何在JS中使用Ajax发出请求
还未走i

感觉这篇博文有点浅薄了。Ajax 应用场景多得啊,比如跨域请求呀、数据缓存呀等等,都只是简单的提到了,没有具体的代码示例来讲解,不够实用。

    有16位网友表示赞同!

如何在JS中使用Ajax发出请求
念旧情i

学习编程真的好累啊,看到这么多复杂的需求,有时候真的会感到沮丧。还好有这样的博文,将知识点梳理清楚,让我在学习路上更有信心!

    有7位网友表示赞同!

如何在JS中使用Ajax发出请求
安好如初

AJAX 的请求过程确实有点繁琐,特别是对于新手来说,容易让人摸不清头绪。这篇博文虽然没有讲解所有细节,但是能提供一个基本的框架,可以帮助入门者更快地理解 AJAX。

    有18位网友表示赞同!

如何在JS中使用Ajax发出请求
几妆痕

我之前用的是 jQuery 来进行 Ajax 请求,感觉用法很简洁,这种原生 JavaScript 的方式确实比 jQuery 更灵活,但也需要更深入的了解 JavaScript 的原理。感谢作者分享!

    有19位网友表示赞同!

如何在JS中使用Ajax发出请求
爱情的过失

这篇博文对一些基础概念解释得不错,比如 xhr 对象、状态码等等。但是对于一些比较深入的场景,比如错误处理、异步操作等,可以再补充一些细节,帮助读者更好地理解。

    有12位网友表示赞同!

如何在JS中使用Ajax发出请求
灵魂摆渡人

学习 AJAX 感觉很有成就感!自己动手实现一个 ajax 请求,比直接使用 jQuery 的方法更能掌握知识点的本质,也让我对 JavaScript 有更深层的理解。

    有11位网友表示赞同!

如何在JS中使用Ajax发出请求
闷骚闷出味道了

这种原生 JavaScript 的方法确实比 jQuery 更灵活,但也需要更深入的了解 JavaScript 的原理。希望作者以后能够写更多关于 AJAX 方面的文章,比如如何处理跨域请求等等

    有12位网友表示赞同!

如何在JS中使用Ajax发出请求
拽年很骚

ajax 请求过程确实有点繁琐呀,特别是对于新手来说,容易让人摸不清头绪。这篇博文虽然没有讲解所有细节,但是能提供一个基本的框架,可以帮助入门者更快地理解 AJAX。

    有7位网友表示赞同!

如何在JS中使用Ajax发出请求
采姑娘的小蘑菇

我之前也试过用 ajax 写一个简单的程序,结果各种错误,让我好崩溃啊!幸好这篇博客里有详细的步骤和代码解释,这下终于明白怎么搞了!

    有13位网友表示赞同!

如何在JS中使用Ajax发出请求
念安я

ajax 请求太常见了,几乎都在前端开发中用到。希望能分享一些更高级的应用场景,比如使用 Promise 或 async/await 来简化异步操作。

    有8位网友表示赞同!

如何在JS中使用Ajax发出请求
玻璃渣子

我之前一直用 jQuery 的 ajax 方法,现在尝试使用原生 JavaScript 感觉的确比原来更快更有控制力!感谢作者分享你的经验!

    有13位网友表示赞同!

如何在JS中使用Ajax发出请求
∞◆暯小萱◆

看了这篇博文以后,感觉AJAX的原理其实很简单,只要掌握了基本的流程和步骤,就能轻松地完成请求操作!

    有10位网友表示赞同!

如何在JS中使用Ajax发出请求
金橙橙。-

文章很详细地讲解了 AJAX 的使用方法,尤其是在状态码解释部分做得很好。对新手来说非常友好!

    有13位网友表示赞同!

如何在JS中使用Ajax发出请求
慑人的傲气

学习编程真是个漫长而又充满挑战的过程啊。希望以后还有更多优秀的博文能够帮助我更好的理解 JavaScript 和 AJAX。

    有16位网友表示赞同!

如何在JS中使用Ajax发出请求
怅惘

AJAX 确实是一个很棒的技术,可以让我们轻松地实现异步操作,提高用户体验。这篇博文讲解得非常到位,真受用!

    有5位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/141599.html

(0)
小su's avatar小su
上一篇 2024年9月19日 上午1:15
下一篇 2024年9月19日 上午1:21

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注