当前位置: 首页 > 知识库问答 >
问题:

为什么浏览器发送一个选项请求,即使我的前端代码只是发出一个POST请求?

长孙弘壮
2023-03-14

我的前端代码:

<form action="" onSubmit={this.search}>
  <input type="search" ref={(input) => { this.searchInput = input; }}/>
  <button type="submit">搜索</button>
</form>

// search method:
const baseUrl = 'http://localhost:8000/'; // where the Express server runs
search(e) {
  e.preventDefault();
  let keyword = this.searchInput.value;
  if (keyword !== this.state.lastKeyword) {
    this.setState({
      lastKeyword: keyword
    });
    fetch(`${baseUrl}search`, {
      method: 'POST',
      // mode: 'no-cors',
      headers: new Headers({
      'Content-Type': 'application/json'
      }),
      // credentials: 'include',
      body: JSON.stringify({keyword})
    })
  }
}

和我的Express.js服务器代码:

app.all('*', (req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  // res.header('Access-Control-Allow-Credentials', true);
  res.header('Content-Type', 'application/json; charset=utf-8')
  next();
});

如您所见,Express服务器在端口8000上运行,React开发服务器在端口3000上运行。localhost:3000正在请求localhost:8000/search,并且localhost:8000正在通过使用POST方法请求另一个源。但是,只有第二个请求工作得很好。我不知道怎么会这样。当然,如果我用querystring发出GET请求,事情就正常了。但我也想知道如何用请求正文进行POST获取。

共有1个答案

谯乐池
2023-03-14

options请求由浏览器自行自动发送,然后再从代码中尝试post请求。这叫做CORS预飞行。

https://developer.mozilla.org/en-美国/docs/web/http/cors#preflighted_requests有详细信息。

在本例中,它的要点是代码添加的content-type:application/json请求头触发浏览器执行预飞行options请求。

npm install cors
var express = require('express')
  , cors = require('cors')
  , app = express();
const corsOptions = {
  origin: true,
  credentials: true
}
app.options('*', cors(corsOptions)); // preflight OPTIONS; put before other routes
app.listen(80, function(){
  console.log('CORS-enabled web server listening on port 80');
});

它将处理options请求,同时还会发回正确的头和值。

 类似资料:
  • 浏览器端,怎么发一个 http2 的请求?

  • 我正在创建自己的API(使用express)和react.js应用程序。但是,当我从react应用程序发送数据时,服务器不会检索数据。这是我的密码: 发布请求客户端: 服务器端POST请求检索: 你知道我怎么解决这个问题吗?

  • 请求方式: "|3|2|url,content|\r" 参数: url 设置Post请求的url链接 content post请求的数据 返回值: "|3|code|data|\r" 参数: code http请求返回的成功或者错误码 成功:code = 200 获取数据失败:code = -1 http请求字段错误:code = 1 data http请求返回的数据 Arduino样例: sof

  • 我有一个API,让用户使用一些凭证登录,我正在开发另一个API,用来注册程序的日志。 基本上我想在我的方法上调用另一个api。 这是我现在拥有的代码,但我总是收到500个空错误: 这是我的控制器上的登录方法: 当用户尝试对自己进行身份验证时,此方法 this.redirectLogs 应将消息发送到我的日志 API,并从中创建日志。 这是方法: 日志 URL 是该方法在我的 loggerAPI 上

  • 问题内容: 我有一个返回promise的方法,并且在内部该方法调用一个API,该API每分钟只能有20个请求。问题是我有很多对象(大约300个),并且我想为每个对象调用API。 目前,我有以下代码: 但是它不处理时序约束。我希望我可以使用_.chunk和_.debounce之类的东西,但是我无法解决这个问题。有人可以帮我吗? 问题答案: 您可以每分钟发送1个包含20个请求的块,或者每3秒将其间隔1

  • 我已经构建了一个API(API.example.com),希望它可以从www.example.com访问。com 我还希望它可以从其他域访问 为此,我添加了访问-控制-允许-起源:* 但是当我打开www.example.com时,在所有api请求之前发送了一个预飞行请求(OPTIONS请求) 如何停止多个预飞行请求?我想应该只有一个起飞前的要求,我做错了什么!!!?或者浏览器在每次通话前都要发送飞