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

Ajax API网关CORS问题,有效负载正确,ajax,api,amazon-web-services,cors,aws-api-gateway,Ajax,Api,Amazon Web Services,Cors,Aws Api Gateway,我一整天都在努力解决这个问题 我得到了一个Lambda函数,当我向端点发出POST请求时,我正试图运行该函数(使用AWSAPI网关配置) 一切都很好,我的选项得到200分,我的帖子得到200分,然后带着我想要的数据回来 然而,当我把它拿回来时,它“认为”它失败了。我在这个项目中使用JQuery,它返回为“fail”cb 查看控制台日志,问题很明显是以下错误: 无法加载XMLHttpRequest . 请求的服务器上不存在“Access Control Allow Origin”标头 资源。因此,

我一整天都在努力解决这个问题

我得到了一个Lambda函数,当我向端点发出POST请求时,我正试图运行该函数(使用AWSAPI网关配置)

一切都很好,我的选项得到200分,我的帖子得到200分,然后带着我想要的数据回来

然而,当我把它拿回来时,它“认为”它失败了。我在这个项目中使用JQuery,它返回为“fail”cb

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

无法加载XMLHttpRequest . 请求的服务器上不存在“Access Control Allow Origin”标头 资源。因此,不允许使用源“” 进入

标准的CORS发行。但我所做的一切似乎都不管用。我在API网关上启用了CORS(在此之前,选项将失败)。
'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,然后打开集成响应上的代理,并将我的响应设置为:
{statusCode,headers,body},我能够接近解决方案
这将作为一个成功的事件返回,并在我的ajax调用中运行正确的回调函数。但是,使用此方法,我没有从Lambda获得任何数据…尽管它位于“body”中,但我收到的只是一个空对象


我真的不喜欢使用CORS或手动添加标题,没关系,我不会更新这么多。我只是真的需要让它正常工作:(非常感谢您的帮助。

如果您从API获得了cloudfront的
x-cache:Miss,这很好,因为API Gateway没有在cloudfront端启用边缘缓存。如果您希望CORS与Lambda proxy integration一起工作,您可以返回状态代码和标头,如

{
    "statusCode": 200,
    "headers": { "Access-Control-Allow-Origin": "<domains you need>" }
}
{
“状态代码”:200,
“标头”:{“访问控制允许源”:“”}
}

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

我现在知道了原因,但我能够让它工作。使用以下步骤:

  • 启用CORS
  • 部署API(可能会被跳过…)
  • 手动添加POST方法
  • 在集成响应时启用代理
  • 重新部署API
  • 将回调响应更改为以下格式:{statusCode:200,头:{},体:{}
  • 使用JSON.parse()解析有效负载
  • 这绝对不是一个完美的答案。出于某种原因,打开代理修改了Lambda函数接收数据的方式,因此我必须对其进行字符串化以避免出错。我无法解释为什么会发生这种情况

    我使用的标题是:

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

    更好的解决方案是使用CORS。因为您不必在所有回复中手动插入标题。但我无法实现。因此,如果有人知道此帖子的更好解决方案,请告诉我!

    我已经尝试了上述代理方法,但值是A
    “*”
    (通配符),我使用了
    body:data
    ,因为我确实需要返回resposne数据。但即使如此,我仍然会收到一个错误,并且没有返回有效负载。您可以共享从API网关获得的错误吗?