使用javascript将数据发送到api时出现cors问题[重复]

Posted

技术标签:

【中文标题】使用javascript将数据发送到api时出现cors问题[重复]【英文标题】:getting a cors issue when sending data to an api using javascript [duplicate] 【发布时间】:2020-12-26 04:08:59 【问题描述】:

我正在尝试将表单数据发送到 api,并且当我向 api 发送请求时,我能够在前端对接上获取数据,但我遇到了一个我无法解决的错误,这是代码我将数据发送到 api 的 js

const value = 
            name: document.getElementById("name").value,
            designation: document.getElementById("designation").value,
            companyName: document.getElementById("companyName").value,
            email: document.getElementById("email").value,
            phoneNumber: document.getElementById("phoneNumber").value,
            pinCode: document.getElementById("pinCode").value,
            location: document.getElementById("location").value,
            message: document.getElementById("message").value,
          ;

          const formReset = document.getElementById("contactForm");
          formReset.reset();

          const data = JSON.stringify(value);
          console.log(data);
          console.log(value.email);
var myHeaders = new Headers();

          myHeaders.append("Content-Type", "application/json");

          let requestOptions = 
            method: "POST",
            headers: myHeaders,
            body: JSON.stringify(value),
            redirect: "follow",
          ;

          fetch(
            "https://us-central1-gmbexample-f23ef.cloudfunctions.net/api/forms",
            requestOptions
          )
            .then((response) => response.text())
            .then((result) => 
              console.log(result);
              alert(
                "Your form has been submitted successfully."
              );
            )
            .catch((error) => console.log("error", error));

这里是我如何处理后端请求

const functions = require("firebase-functions");
const express = require("express");
const bodyParser = require("body-parser");

const app = express();
require("dotenv").config();

app.use((req, res, next) => 
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With",
    "Content-Type",
    "Accept"
  );
);
app.use(bodyParser.urlencoded( extended: true ));
// URL => /api/reports (PUT)
//   .put("/reports", reportsServer);
app.post("/forms", async (req, res) => 
  console.log(req.body);
  res.status(200).send("oj");
);
exports.api = functions.https.onRequest(app);

我得到的错误是 CORS 策略已阻止从源“https://gmbexample-f23ef.firebaseapp.com”访问“https://us-central1-gmbexample-f23ef.cloudfunctions.net/api/forms”获取:对预检的响应请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

任何人都可以提出任何解决方案

【问题讨论】:

解决方法在错误中。服务器必须提供“Access-Control-Allow-Origin”标头。时期。就是这样。 @gforce301 我在后台添加 res.header 接受 2 个字符串 field, value 或包含标头的 JSON 对象作为 key-value 对。请将第二次呼叫修复为res.header 并检查 @KunalKukreja 是否可以为特定请求应用 cors 规则,例如在我的情况下,我只想为 /forms 应用 cors,我正在尝试您建议的解决方案 @Amar 你可能想使用这个:npmjs.com/package/cors#enable-cors-for-a-single-route。这将为您省去所有的麻烦 【参考方案1】:

CORS 是一种安全协议,用于确保向您的 API 发出 API 请求的客户端获得授权。浏览器执行“预检”检查,通过向您的 API 发送 HTTP OPTIONS 请求来确定这一点,这会告诉客户端它是否具有该权限。

您的 API 将需要使用所需的 CORS 标头来响应 OPTIONS 请求:https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request。

您对 OPTIONS 请求的响应至少应包含以下标头:

Access-Control-Allow-Origin: https://foo.bar.org

Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE

您可以在此处将值替换为 *,但如果您打算不公开您的 API,那么出于安全考虑,首选使用特定域,这样 CORS 实际上会做一些有用的事情。

【讨论】:

我已经为 Access-Control-Allow-Origin 添加了 *【参考方案2】:

你试过用chrome工具https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf吗?

【讨论】:

这不适用于触发预检的请求(如在本例中)并且无论如何在生产环境中都不实用(要求人们安装浏览器扩展以禁用安全功能是不合理)。

以上是关于使用javascript将数据发送到api时出现cors问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将数据发送到视图时出现 JsonMappingException

尝试通过函数参数将正文发送到 API 时出现 KeyError

将数据从套接字从C ++服务器发送到Python客户端时出现问题

通过 Python API 客户端将经过验证的查询发送到 BigQuery 时出现语法错误

在 C 中通过串行/COM 端口发送 MIDI 数据时出现问题

在Angular 4中将数据发送到JAVA post REST API时出现CORS错误