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

AWS获取请求,主体被CloudFront拒绝

葛修永
2023-03-14

我正在使用AWS SAM(Lambda

第三方调用我的API,并在正文中包含JSON的GET请求。但是,当请求发送到带有正文的API时,CloudTop会拒绝该请求。

请求如下:

curl -X GET -H "Content-Type: application/json" --data '{"hello":"world"}' https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api

以下是回应:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
    <HEAD>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
        <TITLE>ERROR: The request could not be satisfied</TITLE>
    </HEAD>
    <BODY>
        <H1>403 ERROR</H1>
        <H2>The request could not be satisfied.</H2>
        <HR noshade size="1px">
Bad request.


        <BR clear="all">
        <HR noshade size="1px">
        <PRE>
Generated by cloudfront (CloudFront)
Request ID: 1p0St_-e3noQL-2uMxeB_2I6lkMr1mg5afvxJRmVpCdnG67Vgnhj9w==
</PRE>
        <ADDRESS></ADDRESS>
    </BODY>
</HTML>

检查日志时,请求永远不会命中API网关或Lambda函数。但是,如果我从请求中删除正文,那么它将命中Lambda函数,并且我将从API中获得适当的错误消息(告诉调用方预期的正文丢失)。

curl -X GET -H "Content-Type: application/json" https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api

我通过SAM模板使用API网关的基本配置。这是相关章节:

MyApiFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: bin/main.zip
    Handler: main
    Runtime: go1.x
    Tracing: Active
    Role: !Sub ${MyApiLambdaExecutorRole.Arn}
    Events:
      CatchAll:
        Type: Api
        Properties:
          Path: /my-api
          Method: GET

共有1个答案

师腾
2023-03-14

GET请求不能包含请求主体。尝试使用POST来代替。

如果要在GET请求中发送有限的数据,可以使用查询参数。

你可以在AWS Lambda文档中看到,这在这里是不可能的:

https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-lambda-non-proxy-integration.html

这是因为您提交的GET请求不能接受有效负载,并且请求验证失败。

您可以使用EC2实例或其他不使用API网关的服务来处理请求。

 类似资料:
  • 我设置了以下信息: 创建了AWS S3存储桶并将一些映像上载到特定文件夹 创建了AWS CloudFront web发行版: 来源域名:从列表中选择的S3 bucket 限制存储桶访问:是 来源访问标识:选定的已有标识 授予桶的读取权限:是,更新桶策略 拒绝访问

  • 我有以下问题:我试图在Spring控制器处理POST请求之前获取它的主体。为此,我使用HandlerInterceptorAdapter的preHandle()方法。 如本讨论中所述 SpringREST服务:从请求中检索JSON 我也使用使用此包装器,我设法打印了第一个POST请求的正文,但第二个POST抛出一个IOException:流关闭。 您对如何获取所有POST请求的正文有什么想法吗?

  • 问题内容: 我在端口5000的node.js服务器上设置了CORS,如下所示: 我现在正尝试像这样在从硬盘打开的静态网页中使用JQuery发送AJAX POST请求: 该函数从不调用,并且我得到的唯一警报是来自XHR 处理程序的警报,其中包含以下错误: 我认为CORS配置合理, 我缺少什么? 编辑 :对于我而言,我能找到的最佳解决方案是从服务器发送页面: 问题答案: 这是我正在使用的代码。它位于我

  • 如何将转换为请求正文的表示形式?或者,如何正确地记录整个请求/响应,同时能够在其中散列潜在的凭据?

  • 问题内容: 首先,可能会说这个问题与HTTP请求正文非常相似,即它没有通过AWS API Gateway到达AWS Lambda函数,或者没有通过API网关在AWSLambda中获取json正文 但是,这些问题都没有解决使用Golang的问题,而我一直遇到的问题是找到与Node.js文档中各处使用的参数等效的参数。 这是我的Lambda函数: 问题:从API GW调用时,对象未填充任何值。该行导致

  • 问题内容: 我是Go的新手,但到目前为止,我非常喜欢它。 我有一个我不知道的问题。我正在将API从Node迁移到Go,并且有此日志必须捕获POST 原样 并将其保存到Postgresql数据库的type列中。 这意味着我不能使用或预定的任何东西。 POST是用body raw制作的,如下所示: 在Node + Hapi上非常简单: 然后我可以从访问JSON 。 我正在将Go与Echo一起使用,所以