fetch网络请求详解

一:三种常见的网络请求对比:

  1. AJAX:基于XMLHttpRequest收发请求,使用较为繁琐,代码量会比较多
  2. axios:基于promise的请求客户端,在浏览器和node中均可使用,使用便捷,功能强大
  3. fetch:内置api,基于promise,用法和axios类似,功能更为简单,没有axios那么强大

AJAX现在一般为学习过渡使用,日常开发中一般不会使用。做项目的时候一般是使用axios,当项目规模比较小,调用接口次数很少的时候可以使用 fetch 替换 axios ,这样更为便捷迅速。

如果你想了解fetch参数,可以参考文章fetch() - Web API 接口参考 | MDN。本文主要是讲解fetch的使用。

二:fetch详解

全局的fetch()方法用于发起获取资源的请求,它返回一个promise,这个promise会在请求响应后被resolve,并传回request对象。

1、fetch核心语法

下面代码是一个简答的fetch请求,在这些请求中,我们主要分为以下三步:

  • 发送请求
  • 处理响应(JSON)
  • 处理异常

在这里我们要注意,我们的参数是使用的一个 URLSearchParams 对象,在url传参中使用 toString() 方法去完成参数的传递。并且 fetch 的请求方式默认为 get 。并且返回的是一个promise ,所以我们需要使用 await 进行等待。并且处理最终返回的 JSON 对象。

javascript 复制代码
<body>
    <h2>fetch核心语法</h2>
    <button class="btn">测试</button>
    <script>
        document.querySelector('.btn').addEventListener('click',async () => {
            // 生成一个params,方便后面转换成字符串
            const p = new URLSearchParams({pname:'贵州省',cname:'贵阳市'})
            // 发送请求,默认是get方法
            const res = await fetch('http://hmajax.itheima.net/api/area?' + p.toString())
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const data = await res.json()
               console.log(data);
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

2、fetch提交FormData

在实际的项目开发中,提交文件一般是FormData格式,因此与JSON格式写法是不一样的,但是其实思路也是可以分为请求方法和提交数据,解析返回值三步。接下来让我们来看一下代码的具体实现。

在下方代码中,HTML中是上传图片和图片的回显,使用 DOM 去绑定事件。获取到选择的图片,然后添加到 FormData 对象中,在上传接口中将 FormData 传递过去。而后去处理返回的结果,拿到返回结果中的 url 地址,再使用 DOM 去回显到我们的 img 标签。

html 复制代码
<body>
    <h2>提交FormData</h2>
    <input type="file" class="ipt">
    <img src="" alt="" class="icon">
    <script>
        document.querySelector('.ipt').addEventListener('change',async function() {
            // 获取选择的图片
            const img = this.files[0]
            // 将选择的图片添加到FormData对象中
            const data = new FormData()
            data.append('img',img)
            // 使用fetch上传
            const res = await fetch('http://hmajax.itheima.net/api/uploadimg',{
                method:'post',
                body:data
            })
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const resData = await res.json()
               console.log(resData);
               // 回显
               document.querySelector('.icon').src = resData.data.url
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

3、fetch提交JSON

跟服务器正常通信一般是 JSON 对象,这个区别于 FormData 主要是对了请求头设置这一步。下面让我们来看一下具体的实现步骤吧!

html 复制代码
<body>
    <h2>fetch提交JSON</h2>
    <button class="btn">提交JSON</button>
    <script>
        document.querySelector('.btn').addEventListener('click',async () => {
            // 实例化Headers对象
            const headers = new Headers()
            // append 添加 keyvalue
            headers.append('content-type','application/json')


            const res = await fetch('http://hmajax.itheima.net/api/register',{
                method:'post',
                // 这里因为和上面的headers是同名的,所以直接简写
                headers,
                // 因为要传JSON对象,所以需要转一下
                body:JSON.stringify({
                    username:'baoNvCode',
                    password:'123456'
                })
            })
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const resData = await res.json()
               console.log(resData);
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

三:总结

fetch 适用于开发请求接口次数少的项目,这种情况下相较于axios能够更加的节省资源,以及提高代码的简洁性,降低后期维护需要的成本。掌握 fetch 是不难的,主要是要学会各种情况下的不同使用,以及不同参数的书写逻辑。好啦本文就到此位置了,希望能够对你有所帮助哦。

相关推荐
golitter.9 小时前
Ajax和axios简单用法
前端·ajax·okhttp
学习使我快乐011 天前
AJAX 2——Bootstrap弹框使用、图书管理案例、图片上传方法
ajax·okhttp·bootstrap
前端李易安1 天前
ajax的原理,使用场景以及如何实现
前端·ajax·okhttp
学习使我快乐012 天前
AJAX 1——axios体验、认识URL、常用请求方法、HTTP协议、错误处理、form-serialize插件
前端·http·ajax·okhttp·axios
帅次3 天前
解决 Android WebView 无法加载 H5 页面常见问题的实用指南
android·okhttp·gradle·binder·webview·retrofit·appcompat
懒洋洋大魔王5 天前
7.Javaweb-Ajax
前端·ajax·okhttp
被迫学习Java6 天前
前端工程化17-邂逅原生的ajax、跨域、JSONP
前端·ajax·okhttp
Liuxu09036 天前
Ajax开发技术
java·前端·ajax·okhttp·javaweb
上官花雨6 天前
第七章综合实践:JPA+Thymeleaf增删改查
spring boot·后端·okhttp
丶白泽7 天前
重修设计模式-行为型-责任链模式
okhttp·设计模式·责任链模式