当前位置: 首页 > 知识库问答 >
问题:

AWS API网关-CORS+POST不工作

欧阳飞
2023-03-14

然后,我创建了一个简单的html页面,作为S3上的静态网站托管,使用Route53将一个域指向该页面,并开始使用jQuery$.ajax测试API进行调用。

所有这些看起来都很简单、简单,并且与文档中所解释的完全一样,只是GET工作并按预期将文本输出到控制台。POST版本会导致以下错误:

请求的资源上没有'Access-Control-Allow-Origin'标头。因此,不允许访问来源'http://example.com'。响应的HTTP状态代码为400。

POST /dev/urls HTTP/1.1
Host: kykul1mshe.execute-api.us-east-1.amazonaws.com
Connection: keep-alive
Content-Length: 73
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json
Referer: http://example.com/dev.html
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
HTTP/1.1 400 Bad Request
Date: Fri, 19 Aug 2016 02:14:16 GMT
Content-Type: application/json
Content-Length: 177
Connection: keep-alive
x-amzn-RequestId: a1160e45-65b2-11e6-9766-cd61e49fbcdb
X-Cache: Error from cloudfront
Via: 1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id: N9mf7apicKbSM_MiZjePbEgZGIFKckWJ3lZljH8iHVKFVTcIIOQuHg==
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:kykul1mshe.execute-api.us-east-1.amazonaws.com
Origin:http://example.com
Referer:http://example.com/dev.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

选项原始响应标头:

Access-Control-Allow-Headers:Content-Type,X-Amz-Date,Authorization,X-Api-Key,Cache-Control,X-Requested-With
Access-Control-Allow-Methods:POST,OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:79
Content-Type:application/json
Date:Fri, 19 Aug 2016 02:14:16 GMT
Via:1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id:KpGEDmIuf5RHcUnBWuA3oEMZgWHwrjy3SpLuOflRhAD8IIx5vyKGSw==
x-amzn-RequestId:a10bae11-65b2-11e6-bcf7-63b49c24629e
X-Cache:Miss from cloudfront

返回200 OK

共有1个答案

姚棋
2023-03-14

好的,我找到了问题的根源,碰巧与APIG完全无关,并证实了@abhignanagaraja提到的,我的APIG配置正确。

问题实际上在于我调用jquery.ajax的方式,我认为它足够聪明,可以在contentType为'application/JSON'时将参数转换为JSON字符串。我似乎必须手动地对JSON参数进行字符串化,而不是传递一个JSON并让jQuery对其进行字符串化。

所以这是个糟糕的决定:

$.ajax({
        url: myEndpoint,
        type: 'POST',
        crossDomain: true,
        data: {
            url: $('#url').val()
        },
        headers: {
            "X-Api-Key": 'blablabla'
        },
        dataType: 'json',
        contentType: "application/json",
        success: function (data) {
            console.info(data);
        }
    });
 $.ajax({
        url: myEndpoint,
        type: 'POST',
        crossDomain: true,
        data: JSON.stringify({
            url: $('#url').val()
        }),
        headers: {
            "X-Api-Key": 'blablabla'
        },
        dataType: 'json',
        contentType: "application/json",
        success: function (data) {
            console.info(data);
        }
    });
 类似资料:
  • 我们正在尝试从C#Windows服务调用AWS API网关来执行后台作业。哪个应该触发API网关定期初始化请求? 我们使用RestSharp调用APIendpoint,该类称为AwsAuthenticator,它继承自RestSharp.Authenticators.IAAuthenticator。但当我们调用API Gateway时,收到的错误是“我们计算的请求签名与您提供的签名不匹配。请检查您

  • 我试图使用CloudFormation在API网关中部署一个API。这些方法要求启用CORS,我按照这里的模板在Cloudformation模板中启用CORS for API Gateway来做到这一点。这是我的模板 部署API后,方法返回一个200,响应标头如下 访问-控制-允许-起源→* 通过→1.1 sdlkfnsdlk.CloudFront.net(CloudFront) X-AMZ-CF

  • 我正在本地运行一个Flask-Restful API,并从另一个端口发送一个包含JSON的POST请求。我得到了错误 我得到 它将“Access-Control-Allow-Origin”显示为“*”。GET工作正常,只是POST给出了这个错误。会出什么问题?如果相关,对于前端,我使用react并通过Axios请求。

  • 我是Spring云和Spring后端开发的新手。我正在尝试用SpringCloudGateway开发一个简单的微服务。 Github链接到Discovery Server、Spring Cloud Api网关和用户微服务。令人惊讶的是,当我在Postman中执行API时,GET API起作用,但POST却不起作用。 我试着调试,但它并没有传到我的控制器上。我错过了什么?还是做错了?任何帮助或建议都

  • 1个资源,1个POST方法集成了lambda。 我使用了“enable cors”选项--我尝试在资源和POST请求上应用此选项(并在之后部署API)。 在API GW中,我可以看到在POST method-method Response区域下的200个响应头中列出。 在curl中:选项调用 回应是: 但是用post: 我还能查什么?

  • 我们有一个位于S3上的静态web站点。 从页面中,我们执行一个jquery ajax post到AWS api Gateway/lambda函数。 我不确定选项是如何工作的,但当我们启用“Chrome allow cross origin插件”时,所有工作都很好(我们得到了JSON响应), 当插件被禁用时,我们得到错误“Request header field access-control-all