Возможно ли получить запрос к облачной функции из внешнего интерфейса? - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь сделать запрос GET к функции облака GCP из внешнего интерфейса в JS, но получаю сообщение об ошибке:


Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://us-central1-<project>.cloudfunctions.net/<function-name>. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Первоначально я собирался позвонить третьей стороне API из внешнего интерфейса, но он тоже дал мне эту ошибку, тогда я собирался посмотреть, могу ли я использовать CF в качестве посредника, но я предполагаю, что мне нужно будет настроить сервер?

Конечно, можно сделать запрос GET от внешнего интерфейса к облачной функции или другому сайту?

axios({
    method: 'GET', //you can set what request you want to be
    url: "http://<cloud-function>.com/<function-name>",
    data: {message: "test"},
}).then(data => {
    console.log(data)
}).catch(error => {
    console.log(error)
})

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Это политика безопасности браузера, позволяющая избежать неожиданного запроса. Если вы являетесь владельцем функции, вам необходимо настроить белый список для своего сервера.

exports.corsEnabledFunction = (req, res) => {
  // Set CORS headers for preflight requests
  // Allows GETs from any origin with the Content-Type header
  // and caches preflight response for 3600s

  res.set('Access-Control-Allow-Origin', '*');

  if (req.method === 'OPTIONS') {
    // Send response to OPTIONS requests
    res.set('Access-Control-Allow-Methods', 'GET');
    res.set('Access-Control-Allow-Headers', 'Content-Type');
    res.set('Access-Control-Max-Age', '3600');
    res.status(204).send('');
  } else {
    res.send('Hello World!');
  }
};

Этот код соответствует официальному документу GCP https://cloud.google.com/functions/docs/writing/http

1 голос
/ 11 июля 2020

Определенно возможно. Вам необходимо разрешить свое происхождение в облачной функции.

С другой стороны, попробуйте использовать следующее:

axios({
    method: 'GET', //you can set what request you want to be
    url: "https://cors-anywhere.herokuapp.com/http://<cloud-function>.com/<function-name>",
    data: {message: "test"},
}).then(data => {
    console.log(data)
}).catch(error => {
    console.log(error)
})
0 голосов
/ 11 июля 2020

Как упоминалось другими, я могу разрешить CORS в облачной функции, но вот как это сделать usng Nodejs:

exports.someFunction = (req, res) => {
  res.set('Access-Control-Allow-Origin', "*")
  res.set('Access-Control-Allow-Methods', 'GET, POST')
  res.set('Access-Control-Allow-Headers', 'Content-Type');

  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
};

Теперь я могу вызвать это из своего внешнего интерфейса.

...