大家好,今天小编来为大家解答以下的问题,关于如何在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对象
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 不同,我们必须显式处理它们。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/141599.html
用户评论
南宫沐风
这篇文章太棒了!我一直在想办法使用 Ajax 进行请求,终于明白了步骤!以前总是觉得异步操作很复杂,现在看着你的解释,简直明明白白,感谢你的讲解!
有15位网友表示赞同!
咆哮
Ajax 的应用场景确实很多,比如更新网页内容、获取数据等等。你的文章解释得很详细,让我对 Ajax 理解更深了,以后可以直接参考来解决实际问题。
有9位网友表示赞同!
打个酱油卖个萌
之前也学过一些关于 JavaScript 的东西,但对于 Ajax 还是一头雾水。幸好你写这篇文章,把 Ajax 的原理和用法都简单明了的介绍了一遍,真的很有帮助!
有15位网友表示赞同!
还未走i
感觉这篇博文有点浅薄了。Ajax 应用场景多得啊,比如跨域请求呀、数据缓存呀等等,都只是简单的提到了,没有具体的代码示例来讲解,不够实用。
有16位网友表示赞同!
念旧情i
学习编程真的好累啊,看到这么多复杂的需求,有时候真的会感到沮丧。还好有这样的博文,将知识点梳理清楚,让我在学习路上更有信心!
有7位网友表示赞同!
安好如初
AJAX 的请求过程确实有点繁琐,特别是对于新手来说,容易让人摸不清头绪。这篇博文虽然没有讲解所有细节,但是能提供一个基本的框架,可以帮助入门者更快地理解 AJAX。
有18位网友表示赞同!
几妆痕
我之前用的是 jQuery 来进行 Ajax 请求,感觉用法很简洁,这种原生 JavaScript 的方式确实比 jQuery 更灵活,但也需要更深入的了解 JavaScript 的原理。感谢作者分享!
有19位网友表示赞同!
爱情的过失
这篇博文对一些基础概念解释得不错,比如 xhr 对象、状态码等等。但是对于一些比较深入的场景,比如错误处理、异步操作等,可以再补充一些细节,帮助读者更好地理解。
有12位网友表示赞同!
灵魂摆渡人
学习 AJAX 感觉很有成就感!自己动手实现一个 ajax 请求,比直接使用 jQuery 的方法更能掌握知识点的本质,也让我对 JavaScript 有更深层的理解。
有11位网友表示赞同!
闷骚闷出味道了
这种原生 JavaScript 的方法确实比 jQuery 更灵活,但也需要更深入的了解 JavaScript 的原理。希望作者以后能够写更多关于 AJAX 方面的文章,比如如何处理跨域请求等等
有12位网友表示赞同!
拽年很骚
ajax 请求过程确实有点繁琐呀,特别是对于新手来说,容易让人摸不清头绪。这篇博文虽然没有讲解所有细节,但是能提供一个基本的框架,可以帮助入门者更快地理解 AJAX。
有7位网友表示赞同!
采姑娘的小蘑菇
我之前也试过用 ajax 写一个简单的程序,结果各种错误,让我好崩溃啊!幸好这篇博客里有详细的步骤和代码解释,这下终于明白怎么搞了!
有13位网友表示赞同!
念安я
ajax 请求太常见了,几乎都在前端开发中用到。希望能分享一些更高级的应用场景,比如使用 Promise 或 async/await 来简化异步操作。
有8位网友表示赞同!
玻璃渣子
我之前一直用 jQuery 的 ajax 方法,现在尝试使用原生 JavaScript 感觉的确比原来更快更有控制力!感谢作者分享你的经验!
有13位网友表示赞同!
∞◆暯小萱◆
看了这篇博文以后,感觉AJAX的原理其实很简单,只要掌握了基本的流程和步骤,就能轻松地完成请求操作!
有10位网友表示赞同!
金橙橙。-
文章很详细地讲解了 AJAX 的使用方法,尤其是在状态码解释部分做得很好。对新手来说非常友好!
有13位网友表示赞同!
慑人的傲气
学习编程真是个漫长而又充满挑战的过程啊。希望以后还有更多优秀的博文能够帮助我更好的理解 JavaScript 和 AJAX。
有16位网友表示赞同!
怅惘
AJAX 确实是一个很棒的技术,可以让我们轻松地实现异步操作,提高用户体验。这篇博文讲解得非常到位,真受用!
有5位网友表示赞同!