好的,我已经遍布这些互联网寻找对我的问题有所了解;我可能已经通过了超过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标头时,它会抱怨媒体类型。
无论如何,对于如何解决第三个错误的任何帮助都将非常受欢迎。
答案 0 :(得分:0)
您的浏览器请求中的内容类型是什么?如果在请求中未指定内容类型标头,则API网关假定" application / json"默认情况下。
打开chrome并查看标题我发现cookie是以text / html形式出现的。
我不确定你是否意味着" Content-type"标题在请求中的值设置为" text / html"。如果是,那就是问题所在。您将需要一个匹配的模板,或者您需要通过选择"当没有模板匹配请求Content-Type标头"时默认需要通过。