将数据发布到Web App时,CORS策略阻止XMLHttpRequest [英] XMLHttpRequest blocked by CORS policy when posting data to a Web App

查看:116
本文介绍了将数据发布到Web App时,CORS策略阻止XMLHttpRequest的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试通过Web App将数据发布到我的Google Spreadsheet时,我收到CORS错误响应.这是我得到的错误:

I get a CORS error response when I tried to post my data to my Google Spreadsheet via a Web App. This is the error I get:

来自源"http://localhost:3000"的对"myGoogleSpreadSheetApiURL"处的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:否"Access-Control-Allow-Origin"标头出现在请求的资源上.

Access to XMLHttpRequest at 'myGoogleSpreadSheetApiURL' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我做了一些解决方案,我在互联网上进行搜索,但无法解决问题... 我已经可以从Google Spreadsheet中获取我的JSON数据.

I did some solution, I searched on internet but I can't solve the issue... I could already get my JSON data from the Google Spreadsheet.

当我按下createButton时,可以在Google Spreadsheet上发布和写入数据.

When I push my createButton, I can post and write my data on my Google Spreadsheet.

我应该如何修正我的代码? 你有什么主意吗?

How should I fix my code ? Do you have any idea ?

这是我的react.js代码:

This is my react.js code:

import React,{ Component } from 'react';
import Paper from '@material-ui/core/Paper';
import axios from 'axios';

axios.defaults.baseURL = 'http://localhost:3000';
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';
axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*';

const api = 'https://myGoogleSpreadSheetApiUrl';



class  Price extends Component  {
  state = {
    info: []
  };
  
  constructor(){
    super()
    axios.get(api)
    .then((res) =>{
      console.log(res.data)
      this.setState({
        info: res.data
      })
    })
  };

  createInfo = () =>{
    let res = axios.post(api,{
      id: 100,
      product: "product100",
      price: 1000,
      miniLot: 1000,
    })
    console.log(res)
  }

render(){
      return (
        <div>
              <button onClick={this.createInfo}>createButon</button>
                <Paper>
                   {this.state.info.map(info => <p key={info.id}>{info.product}</p>)}
                </Paper>
        </div>
      );
    }
}

export default Price;

这是我的Google Apps脚本代码:

and this is my Google Apps Script code:

function getData(priceDB) {
  var sheet = SpreadsheetApp.getActive().getSheetByName(priceDB);
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {};
    row.map(function(item, index) {
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
}

function doGet() {
  var data = getData('DBprice');
  return ContentService.createTextOutput(JSON.stringify(data, null, 2))
  .setMimeType(ContentService.MimeType.JSON);
}


function doPost(e) {
  
  var ss       = SpreadsheetApp.getActiveSpreadsheet();
  var sheet    = ss.getSheetByName('DBprice'); 
  var PostData = JSON.parse(e.postData.contents);
  
  sheet.appendRow([PostData.id, PostData.product, PostData.price]);
}

推荐答案

Google应用程序脚本网络应用程序当前仅支持以下HTTP方法:

Only the following HTTP methods are supported by Google apps script web- application currently:

  • POST
  • GET
  • POST
  • GET

OPTIONS方法.因此,如果您的React Web应用程序的请求是已预告 ,则请求将失败().为避免进行预检,请考虑将帖子正文和Content-Type更改为以下类型之一(即

OPTIONS method is currently not supported. So, if requests from your React web-app is preflighted, the requests will fail(http-status-code-405). To avoid preflighting, consider changing the post body and Content-Type to one of the following types(so called Simple requests):

  • application/x-www-form-urlencoded
  • multipart/form-data
  • 文本/纯文本

此外,为了避免重定向到html页面,您应该return来自服务器端的文本.

Also, In order to avoid redirection to a html page, you should return text from the server side.

客户端:

axios.defaults.headers.post['Content-Type'] = 'text/plain';
/*....*/
createInfo = () =>{
 let res = axios.post(api,JSON.stringify({
  id: 100,
  product: "product100",
  price: 1000,
  miniLot: 1000,
  })
 )
//console.log(res)
}

服务器端:

function doPost(e) {
  /*Stuff*/
  return ContentService.createTextOutput("done");
}

这篇关于将数据发布到Web App时,CORS策略阻止XMLHttpRequest的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆