如何使用 fetch 发布内容类型为 application/json

Posted

技术标签:

【中文标题】如何使用 fetch 发布内容类型为 application/json【英文标题】:How to use fetch to post with content-type of application/json 【发布时间】:2017-07-06 19:44:40 【问题描述】:

我有一个对 API 进行 fetch 调用的 react 应用程序,如下所示:

 postForm(state) 
    var formData = state.formData;
    return fetch('http://localhost:3000/api/V0.1/formSubmit', method: 'POST', headers: "Content-Type": "application/json", body: JSON.stringify(formData))
    .then((response) => response.json())
    .then((responseJson) => 
      console.log(responseJson);
      return null;
    )
    .catch((error) => 
      console.error(error);
    );
  

但是,它被 CORS 阻止,因为规范指出 application/json 是非标准内容类型。

但是,我不确定如何修改我的 fetch 调用以执行所需的飞行前请求以使其允许 application/json。

API 调用是:

app.post("/api/v0.1/formSubmit", function(req, res) 
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', '*');
  var formData=req.body;
  console.log(formData);
  res.status(200).json(formData);
);

【问题讨论】:

【参考方案1】:

在定义您的路由之前。声明

app.use(function(req, res, next) 
        var oneof = false;
        if(req.headers.origin) 
            res.header('Access-Control-Allow-Origin', req.headers.origin);
            oneof = true;
        
        if(req.headers['access-control-request-method']) 
            res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
            oneof = true;
        
        if(req.headers['access-control-request-headers']) 
            res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
            oneof = true;
        
        if(oneof) 
            res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
        

        // intercept OPTIONS method
        if (oneof && req.method == 'OPTIONS') 
            res.send(200);
        
        else 
            next();
        
    );

在 CORS 中,检查请求以获取服务器上的可用方法。即在 OPTIONS 请求中。当您收到成功的响应后,您就可以发送请求了。

您也可以为特定页面启用 CORS。在这里学习https://github.com/expressjs/cors

【讨论】:

以上是关于如何使用 fetch 发布内容类型为 application/json的主要内容,如果未能解决你的问题,请参考以下文章

如何在发送CSV时覆盖反应js fetch方法中的内容类型

使用 Fetch APi 时如何设置请求头的 content-type

如何使用 Spring Boot Web 客户端为内容类型 application/x-www-form-urlencoded 的表单数据发布请求

使用 fetch() 的 POST 请求返回 204 无内容

fetch().then() 返回内容类型和正文 [重复]

如何在 React Fetch Blob 中使用 content-Type JSON(application/json) 发布原始正文数据