如何在Google App Engine中允许跨站点起源请求?

时间:2019-05-02 18:44:12

标签: express google-app-engine cors app-engine-flexible

我有一个用Express制作的简单API,该API返回json。 Express服务器正在Google App Engine上运行。我正在使用cors(https://www.npmjs.com/package/cors)启用所有CORS请求,但仍然收到“请求的资源上没有'Access-Control-Allow-Origin'标头。”从SPA应用程序执行AJAX请求时。

app.use(cors())

上述根据文档的默认设置为: { "origin": "*", "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", "preflightContinue": false, "optionsSuccessStatus": 204 }

这应该足够了,因为我只从SPA执行简单的GET请求。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

App Engine通过 app.yaml 文件支持CORS,如此处所述:link

在您的 app.yaml 文件中,通过添加handlers元素来修改http_headers部分,如下所示:

handlers:
- url: /images
  static_dir: static/images
  http_headers:
    Access-Control-Allow-Origin: '*'
  # ...

然后,您可以重新部署App Engine以应用配置更改。

答案 1 :(得分:0)

我真的被文档弄糊涂了,因为它意味着 CORS 标头只能在提供静态内容时发送,而不是更常见的场景,即 CORS 告诉浏览器在通过调用时可以接受来自后端的 JSON 或 XML第三方托管脚本。

我的解决方法是将其作为应用程序本身内的自定义标头返回。例如,使用 Flask:

from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def root():
     import traceback
     try:
         data = {'key1': "value1", 'key2': "value2"}
         return jsonify(data), 200, {'Access-Control-Allow-Origin': "*"}
     except:
         return format(traceback.format_exc()), 500,  {'Content-Type': "text/plain"}

if __name__ == '__main__':
    app.run()

答案 2 :(得分:-1)

正如我在这里回答的那样,https://stackoverflow.com/a/62075272/2235936

不需要app.yaml中的handlers东西,只需在G存储桶上设置CORS。