API网关CORS HTTP 415

时间:2017-04-20 00:03:02

标签: amazon-web-services cors aws-api-gateway amazon-kinesis amazon-kinesis-firehose

好的,我已经遍布这些互联网寻找对我的问题有所了解;我可能已经通过了超过80个堆栈溢出线程RE api网关等等,但它们似乎都没有帮助或说得足够接近我的问题。

我是API Gateway和cors的新手,但是让我们看看我是否可以清楚地表达我所看到的问题:

为Kinesis firehose设置一个API网关代理,为红移数据库提供保护。代理,firehose和redshift网关在隔离调用时启动并正常工作,但是当从我们的某个客户站点调用时,我们会收到如下错误:

XMLHttpRequest cannot load [api_call_here]. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin [origin_website_here] is therefore not allowed access. The response had HTTP status code 403.

好的,这强烈暗示需要CORS,对吧?在资源的控制台中,启用cors,deploy,new error:

XMLHttpRequest cannot load [api_call_here]. Request header field $cookies is not allowed by Access-Control-Allow-Headers in preflight response.

Ooooooooookay,来自启用CORS功能添加的新OPTIONS方法,在集成响应中,允许的标头,在访问控制下允许标头添加' $ Cookies',部署。

现在我收到一个新错误,与第一个错误非常相似:

XMLHttpRequest cannot load [api_call_here]. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin [origin_website_here] is therefore not allowed access. The response had HTTP status code 415.

请注意,第一个错误的HTTP状态代码为403,第三个错误的状态代码为415.这就是我遇到问题的地方。如果我进入GET方法作为代理方法,身体映射模板,我有"当没有定义模板(推荐)"地选择。

现在,我读到当API网关无法找到匹配的模板时,它拒绝了415错误,因此我将上述选项更改为"当没有模板匹配请求Content-Type标头"时。这使得错误消失,但是当从原点调用时,数据仍然没有被持久化为红移。再次,当我直接从邮递员,失眠或只是一个普通的旧地址栏调用api时,记录会很好地添加。

打开chrome并查看标题我发现cookie是以text / html形式出现的。

关于那里的模板映射,我只定义了application / json的映射;这可能是问题的一部分吗?

此外,从chrome控制台查看的响应标题如下:

content-length:37
content-type:application/json
date:Wed, 19 Apr 2017 23:43:35 GMT
status:415
via:1.1 [blahblabbleblah].cloudfront.net (CloudFront)
x-amz-cf-id:[blahblabbleblah]
x-amzn-requestid:[blahblabbleblah]
x-cache:Error from cloudfront

我对此比较陌生,所以我不知道cloudfront如何适应这一点,尤其是当控制台抱怨没有access-control-allow-origin标头时,它会抱怨媒体类型。

无论如何,对于如何解决第三个错误的任何帮助都将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

您的浏览器请求中的内容类型是什么?如果在请求中未指定内容类型标头,则API网关假定" application / json"默认情况下。

  

打开chrome并查看标题我发现cookie是以text / html形式出现的。

我不确定你是否意味着" Content-type"标题在请求中的值设置为" text / html"。如果是,那就是问题所在。您将需要一个匹配的模板,或者您需要通过选择"当没有模板匹配请求Content-Type标头"时默认需要通过。