API网关CORS问题,具有正确的有效负载

时间:2017-03-23 22:22:14

标签: ajax api amazon-web-services cors aws-api-gateway

我一直试图解决这个问题。

我有一个Lambda函数,当我向端点发出POST请求(使用AWS API GATEWAY配置)时,我试图运行。

一切运行正常,我的选项获得200分,我的帖子获得200分,然后返回我想要的数据。

然而,当我收回它时,它会认为"它失败了。我在这个项目中使用了JQuery,然后它回来了,因为"失败" CB。

查看控制台日志,问题很明显是以下错误:

  

XMLHttpRequest无法加载   https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/prod/createCustomer。   No' Access-Control-Allow-Origin'标题出现在请求的上   资源。起源' http://localhost:3000'因此是不允许的   访问。

标准的CORS问题。但我所做的一切似乎都无效。我在API网关上启用了CORS(之前OPTIONS会失败)。 'Access-Control-Allow-Origin':设置为:'*',允许从任何来源进行访问。我当然部署了新的API。

我也尝试过不使用CORS,而是启用AWS代理服务器,然后像我这样做{ statusCode, headers, body },但是当我这样做时,我没有得到任何响应。

我完全不知道从哪里开始尝试解决这个问题。我甚至尝试了一种脏的jsonp方法。但还是同样的问题。 :(

我可以在我的请求中找到的唯一一点看起来不行的数据是:x-cache:Miss from cloudfront

这里是来自POST请求的完整响应标头:

content-length:2312
content-type:application/json
date:Thu, 23 Mar 2017 22:15:08 GMT
status:200
via:1.1 95a477af435073615179b256d8101334.cloudfront.net (CloudFront)
x-amz-cf-id:Hc6POYFO0HKB1xriSg2iH7O1po7ah926a4dQkgfSNBUZ460RoHRNuw==
x-amzn-requestid:2b5ed745-1016-11e7-b497-cb0a77cd1479
x-amzn-trace-id:Root=1-58d448ea-56717776eaa3f5389083e9ca
x-cache:Miss from cloudfront

可悲的是,很明显,访问控制标题不在那里......我认为这是我迫切想要解决的问题。但我不知道为什么因为我把它设置为' *'在此过程的启用CORS步骤期间。

我能够通过手动创建POST方法(而不是" ANY"),然后再次启用CORS,然后启用集成响应上的PROXY,并设置半接近解决方案我的回复:{ statusCode, headers, body }这将作为一个成功的事件返回,并在我的ajax调用中运行正确的回调函数。但是,使用这种方法我没有从Lambda获得数据......尽管它在" body"中,我收到的只是一个空对象。

我并不喜欢使用CORS或手动添加标题,这很好,我不会更新这么多。我真的真的需要让它运作:(任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您从API获得x-cache:Miss from cloudfront,那就没问题了,因为API Gateway不会在云端端启用边缘缓存。如果您希望 CORS 与Lambda代理集成一起使用,您可以返回状态代码和标题,例如,

{
    "statusCode": 200,
    "headers": { "Access-Control-Allow-Origin": "<domains you need>" }
}

然后,它就像来自客户端的空响应。

答案 1 :(得分:1)

我现在知道为什么,但我能够让它运转起来。使用以下步骤:

  1. 启用CORS,
  2. 部署API,(可以跳过......)
  3. 手动添加POST方法,
  4. 在集成响应上启用代理,
  5. 再次部署API
  6. 将回调响应更改为格式:{statusCode:200,header:{},body:{}}
  7. 使用JSON.parse()来解析您的有效负载。
  8. 这绝对不是一个完美的答案。出于某种原因,打开代理修改了我的Lambda函数如何接收数据,所以我不得不对其进行字符串化而不会导致错误。我无法解释为什么会这样。

    我使用的标题是:

    "Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
    "Access-Control-Allow-Origin": "*"
    

    更好的解决方案也是使用CORS实现此目的的一种方法。因为您不必在所有回复中手动插入标题。但我无法做到这一点。所以,如果有人知道这个帖子的更好的解决方案吧!