http请求 状态码204

本文解析了跨域请求中出现204 OPTIONS响应的原因,详细解释了预检请求的作用,并提供了使用egg+mongoose搭建的后端接口如何配置以支持跨域访问的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在调试接口的时候遇到个问题:

一个请求走了两次,一次204,一次200。

且,请求204的  Request Method 是 OPTIONS

在网上查看资料后得知,是因为跨域而引起的,OPTIONS是一种“预检请求”

浏览器在处理跨域访问的请求时如果判断请求为复杂请求,则会先向服务器发送一条预检请求(这就是为什么第一次请求接口是204),根据服务器返回的内容浏览器判断服务器是否允许该请求访问。

如果web服务器采用cors的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。

 

解决方法:

后端接口我是通过egg + mongoose 搭建的。config.default.js 文件里面设置的是:

config.security = {
    csrf :{
        enable:false
    },
    domainWhiteList: [ '*' ],
  };
  // add cors config here
  config.cors = {
      origin: 'http://localhost:3000', // 访问白名单,根据你自己的需要进行设置
      credentials: true,  //允许Cook可以跨域,
      allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
  };

 

### 状态码 204 的含义 状态码 `204` 表示服务器已成功处理请求,但未返回任何内容[^1]。此状态通常用于表示操作已完成,但无需向客户端发送额外的数据。例如,在更新资源或删除资源的操作中,如果不需要返回数据,则可以使用 `204 No Content`。 以下是关于状态码 `204` 的一些重要特性: - 客户端不应更改当前页面视图。 - 响应体为空,因此不会包含任何实体头部字段(如 `Content-Type` 或 `Content-Length`)。 - 浏览器会保留相同的 URL 和历史记录条目。 ### JavaScript 中的状态码 204 处理方式 在 JavaScript 中,可以通过多种库来处理 HTTP 请求及其响应状态码,比如原生的 `fetch API` 或第三方库如 Axios。下面分别介绍两种常见的方式: #### 使用 Fetch API 当通过 `fetch` 发起请求并接收到 `204` 状态码时,由于该状态属于成功的范围 (`2xx`),所以需要手动检查其具体值以确认行为逻辑。 ```javascript fetch('https://example.com/resource', { method: 'DELETE' }) .then(response => { if (response.status === 204) { console.log('Resource deleted successfully, no content returned.'); } }); ``` #### 使用 Axios 库 对于 Axios 来说,它默认认为所有的 `2xx` 范围内的状态都是成功的,并将其传递到 `.then()` 方法中。因此可以直接检测 `status` 属性来进行特定于业务逻辑的处理。 ```javascript import axios from 'axios'; axios.delete('https://example.com/resource') .then(response => { if (response.status === 204) { console.log('The resource was updated or removed without returning any data.'); } }) .catch(error => { console.error('An error occurred:', error); }); ``` 需要注意的是,尽管 `204` 是一种正常的响应,但在某些情况下可能仍需通知用户发生了什么变化或者刷新界面部分区域以便反映最新的后台状态。 ### 总结 无论是采用哪种方式进行开发,都建议开发者清楚地定义每种情况下的预期结果以及如何适当地反馈给前端使用者。这样不仅可以提高用户体验满意度还能减少不必要的困惑和误解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熙熙攘攘Re

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值