简单请求和复杂请求的区别

简单请求和复杂请求

请求满足以下条件为简单请求,否则为复杂请求
1.请求方式是 get/post/head;
2.请求头包含字段可以有:Accept,Accept-Language,content-Language,Last-Event-ID,Content-Type,其中Content-Type的值只能是 application/x-www-form-urlencoded,text/plain,multipart/form-data

简单请求和复杂请求的区别

复杂请求会多发一次请求,例:我们向 3000 服务器发送 "/getdata"的get 请求,浏览器会额外发送一个"/getdata"的options请求,这个请求我们称为预请求,服务器也会做出“预响应”,预请求实际上是一种权限请求,只有预请求成功后,实际的请求才会执行,预请求也存在跨域问题哦。

预检验请求

对于 跨域 的复杂请求会进行预检请求,预检请求是不会携带请求体和自定义的请求头的, 因此对于处理复杂请求的在自定义中间件,遇到预检请求,我们需要直接放行,否则会出现非预期的结果。如果不跨域,是没有预检请求的

例子演示

nodejs端代码,使用express搭建的服务器
允许跨域的中间件

server.use((req,res,next)=>{
	res.set('Access-Control-Allow-Origin',"http://localhost:3000")   
	res.set('Access-Control-Allow-Headers',"Content-Type,authrization")
	next()
})

下面是一个检验token的中间件

server.use((req,res,next)=>{
    const token=req.get('authrization')
    console.log(req.method,token,req.body)
    if(token) next()
    res.status(401).send('no auth')
})

路由接口

server.get('/getdata',(req,res)=>{
   res.send('data')
})

此时前端启动的应用端口是3000
配置代理服务器时,前端发送请求的代码,此时发请求就不跨域了

axios({
        method:'post',
        url:'/getdata',
        headers:{
          authrization:'asffasfdf',
        },
        data:{a:1,b:2}
     })
     .then((res)=>{
        console.log(res.data)
     })
     .catch((err)=>{console.log(err)})

发送请求后,后端的打印结果
在这里插入图片描述此时network处的展示
在这里插入图片描述结果分析:此时虽然为复杂请求,但是此时不跨域,所以不存在预检请求。
未配置代理服务器时,前端发送请求的代码,此时发请求就跨域了

axios({
        method:'post',
        url:'http://localhost:5000/getdata',
        headers:{
          authrization:'asffasfdf',
        },
        data:{a:1,b:2}
     })
     .then((res)=>{
        console.log(res.data)
     })
     .catch((err)=>{console.log(err)})

发送请求后,后端的打印结果
在这里插入图片描述
此时network处的展示
在这里插入图片描述有小伙伴可能疑问,上面不是配置了允许跨域的中间件吗,此时不是不跨域吗?其实并不是这样的,因为是服务端允许3000端口跨域,本质上这请求是从3000发到5000
是跨域的,而配置了代理服务器是不一样的,配置的3000端口的代理服务器向5000端口的的服务器发送请求,服务器之间是不存在跨域的,不受同源策略限制。因此这里是跨域的,所以会有一个预检请求。
解决方案:
1.使用代理服务器
2.在中间件中处理预检请求

server.use((req,res,next)=>{
    if(req.method==='OPTIONS') {next();return}
    const token=req.get('authrization')
    console.log(req.method,token,req.body)
    if(token) next()
    else res.status(401).send('no auth')
})

结尾

相信看完这篇文章的小伙伴对简单请求和复杂请求一定有了一个很好的了解,感谢你的观看,希望这篇文章能给你带来帮助和快乐。如果有小伙伴有一些疑惑或者问题,欢迎提出和分享。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fetch/xhr和其他请求(如axios、ajax等)之间的主要区别在于它们的使用方式和一些功能上的不同。 首先,fetch是一种基于Promise的现代化网络请求API,而xhr是一种传统的XMLHttpRequest对象。fetch API基于新的web标准,可以更好地处理请求和响应,支持更多现代化的功能,而xhr则是老旧的方式。 另一个区别在于fetch API返回的是一个Promise对象,可以使用Promise的链式调用和async/await语法,非常方便处理异步操作。而xhr则需要使用回调函数来处理异步操作,代码结构可能相对复杂。 此外,fetch API默认情况下不会携带cookie信息,需要设置credentials属性为"include"才能发送cookie。而xhr默认会发送cookie信息,需要手动设置xhr.withCredentials属性为true来禁止发送cookie。 另外,fetch API在默认情况下只会拒绝请求错误的状态码(如404或500等),而不会拒绝其他的网络错误(如网络超时)。这意味着需要手动检查并处理网络错误。而xhr则可以通过onerror事件来处理所有类型的网络错误。 最后,fetch API在使用上可能相对简单,语法更加直观。而xhr则相对复杂,需要手动设置请求头、处理请求和响应等。 总结起来,fetch/xhr和其他请求的主要区别在于使用方式、功能支持和代码结构等方面。fetch提供了更现代化、更简洁的API,支持Promise和async/await语法,但xhr仍然是一种可靠和广泛使用的老旧方式。 ### 回答2: fetch和XMLHttpRequest (XHR) 是两种常用的网络请求方式,它们之间有以下几点区别: 1. 语法使用:fetch是浏览器提供的一种基于Promise的现代API,通过使用ES6的语法,使用更加简洁。XHR则是使用传统的回调函数的方式,使得代码可读性较差。 2. URL和参数:在使用fetch时,可以将URL和请求参数作为参数传递给fetch函数。XHR需要手动构建URL和参数,增加了额外的代码。 3. 跨域请求:fetch默认不会将跨域的cookie发送到目标服务器,需要设置`credentials`配置项为"include"。而XHR请求跨域时会自动携带cookie。 4. 请求头配置:fetch通过调用`Headers`对象来设置请求头信息,更加方便。XHR则需要通过`setRequestHeader`方法来设置。 5. 请求/响应:使用fetch时,需要通过两个Promise分别处理请求和响应,使得代码更加清晰。XHR则需要编写多个回调函数来处理请求与响应,并引发回调地狱问题。 6. 取消请求:使用fetch时,可以使用`AbortController`对象来取消正在进行的请求。XHR则需要手动使用`abort`方法来取消请求。 综上所述,fetch相比XHR具有更好的语法简洁性、使用更加方便、处理异步操作更加优雅等优点,但XHR在兼容性和一些特殊场景处理方面表现更好。所以,在选择网络请求方式时,根据具体的场景需求进行选择。 ### 回答3: fetch和XHR(XMLHttpRequest)都是用于发送HTTP请求并获取响应的JavaScript API。它们的主要区别如下: 1. 语法:fetch使用更简洁的语法,基于Promise实现,而XHR使用回调函数来处理异步请求。 2. 兼容性:XHR在所有主流浏览器中都得到了广泛支持,包括较旧的版本。而fetch在一些旧版本的浏览器中可能不被完全支持,需要使用polyfill进行兼容。 3. 请求和响应对象:XHR通过实例化XMLHttpRequest对象,并使用该对象来发送请求和接收响应。而fetch直接使用全局fetch函数来发送请求并返回一个Promise对象,该对象包含响应的相关信息。 4. 请求和响应的处理:XHR可以通过各种回调函数来处理请求和响应,包括onload、onerror和onprogress等。而fetch使用then方法链式调用来处理请求和响应,也可以使用catch捕获错误。 5. 默认不接受跨域请求:在默认情况下,XHR在同源策略下才能发送跨域请求。而fetch在跨域请求时,默认不发送站点的身份验证cookie和HTTP认证信息,需要手动设置credentials为include。 总的来说,fetch相对于XHR提供了更简洁的语法和更强大的功能,并且更符合现代JavaScript的编码风格。但是在兼容性方面,XHR更广泛支持,可以在更多的浏览器环境中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值