我在AWS API网关中创建了具有以下端点的简单API:
POST /v1/users
Run Code Online (Sandbox Code Playgroud)
在方法执行/方法请求中,我添加了请求模型:
此模型架构如下所示:
但是,当我使用json body向该端点发出请求时,{ "foo": "bar" }它不会拒绝它并执行我的lambda函数...
那么,如果没有用于验证请求,为什么还有定义JSON模式的选项呢?
我正在使用API Gateway和Lambda创建一个api.使用API Gateway Stage编辑器中指定的url一切正常; 但是,当我尝试移动到自定义域时,我遇到了一些问题.
我尝试的第一件事是直接从我的域使用Route 53中的CNAME记录到我从API网关获得的域.那是一些错误,我认为这是不正确的解决方案是正确的吗?
接下来,我尝试了API网关中的自定义域名功能.我的理解是,这将卷起一个CloudFront分配,然后我可以从Route 53映射到.当我创建自定义域并添加了域映射时,它为我提供了一个我认为是CloudFront分发的URL.该链接返回403响应,并且未在CloudFront中进行分发.调试此问题的好方法是什么?
我创建了一个 api 网关来将数据放入我的 s3 存储桶中。当我在控制台中测试它时,它没有问题。即使我在授权方测试中测试我的令牌时,它也会返回“允许”,因此我的令牌没有任何问题。我的令牌验证是
^Bearer [-0-9a-zA-z\.]*$
Run Code Online (Sandbox Code Playgroud)
所以我用于生成标题的 python 代码如下所示:
headers = {
"Authorization": "Bearer " + token,
"Content-type": "application/json"
}
Run Code Online (Sandbox Code Playgroud)
我的其余代码是:
response = requests.post(url, headers=headers, data={"id":"0678a93d-ee8c-4db5-a831-1e311be4f04b", "test":"12345"})
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我得到的错误消息是 "{"message":"'{My Token}' not a valid key=value pair (missing equal-sign) in Authorization header: 'Bearer {My Token}'."}"
我的网址如下所示:
https://my-api-gateway.amazonaws.com/MyStage,我在我的资源中使用了 {proxy+}。我注意到如果我将标题从 Content-type 更改为 Accept,它会给我同样的错误,但如果我也将我的 url 更改为https://my-api-gateway.amazonaws.com/MyStage/any-arbitrary-string /,我得到一个
{"response":{"status":"VALID", "message": "success"}}
Run Code Online (Sandbox Code Playgroud)
但该文件没有出现在我的 s3 存储桶中。我该如何解决?
注意:事实证明,这与颤振无关,而与我将 API 网关设置为 Lambda 代理这一事实有关
我试图从 Flutter Web 应用程序访问 API 端点,每次它出错并给我以下错误。
获取传感器数据时出错:DioError [DioErrorType.RESPONSE]:XMLHttpRequest 错误。
我知道这里有几个关于 SO(像这个和这个)的问题在讨论这个问题,解决方案似乎是在服务器端启用 CORS 支持。我正在使用 AWS API 网关来构建 API,我按照这些说明从我的 API 启用 CORS 支持。这是我在 API 网关控制台中的 CORS 设置。
“Access-Control-Allow-headers”中的文本是
'内容类型,X-Amz-日期,授权,X-Api-Key,X-Amz-Security-Token'
在 API 网关上启用 CORS 似乎没有帮助,当我尝试点击 API 时,我的 flutter Web 应用程序仍然遇到相同的错误。
有趣的是,如果我从 chrome 中点击 API(即在浏览器上粘贴 API URL 并点击回车),API 工作得非常好。只有当我尝试从 Flutter Web 应用程序访问 API 时它才会失败。
问题:如何在我的 API 网关中启用 CORS 支持,以便我的 Flutter Web 应用程序可以使用 API?
我正在努力实现与此帖相同的内容,但我不理解那里的答复,并且无权在评论中要求澄清.
我有一个接受GET请求,经过一些请求变量lambda函数(用Python实现),并且经由一个空响应模型返回的text/html(如所描述的API网关端点这里
如前面的SO问题所述,如果Lambda函数返回HTML字符串,并且API端点使用默认的输出直通行为@Intelliration Response,则引用HTML输出:
"\n<html>\n<body>\n ... \n</body>\n</html>\n"
Run Code Online (Sandbox Code Playgroud)
答案(由@ARUNBALAN NV提出)说"只需将HTML标记存储在变量中并将其返回."但我不确定这在Lambda函数的上下文中意味着什么.这是否意味着使用名为"variableHTML"的元素返回"application/json"响应?像这样的东西?
"{\"variableHTML\": \"\\n<html>\\n<body>\\n ... \\n</body>\\n</html>\\n\"}"
Run Code Online (Sandbox Code Playgroud)
我在API网关中进行了设置,我的集成响应现在使用Mapping来完全按照建议提取元素(用于200个应用程序/ json响应):
#set($inputRoot = $input.path('$'))
$inputRoot.variableHTML .
Run Code Online (Sandbox Code Playgroud)
结果现在返回一个点.
我尝试了很多变种($ input.json而不是$ input.path,不同阶段的不同内容类型等),但感觉上面的设置最接近匹配来自其他线程的接受答案.
任何有关我出错的见解将不胜感激.谢谢阅读!
假设我想从我的Api网关端点向我的Lambda函数发出GET请求时,在URL字符串中传递val1和val2:
https://xyz.execute-api.amazonaws.com/prod/test?val1=5&val2=10
Run Code Online (Sandbox Code Playgroud)
我有一个简单的函数,它将两个输入val1和val2相加:
def lambda_handler(event, context):
# How do I get at val1 and val2??
return {'result': val1 + val2}
Run Code Online (Sandbox Code Playgroud)
我已经在AWS API网关上的方法请求中为URL查询字符串参数添加了val1和val2.但是如何在函数内部访问它们呢?
CORS真的让我发疯,我真的没有想法让它变得有用.
我创建了一个简单的APIG Api,其中包含1个名为'abc'的资源,并添加了2个方法GET和POST,其中Authorization设置为NONE,API Key Required设置为false,所有内容都部署到名为'dev'的阶段.
当然,我在两种方法上都启用了CORS,我看到在OPTIONS方法和Access-Control-Allow-中添加了3个标题Access-Control-Allow-Origin,Access-Control-Allow-Headers和Access-Control-Allow-Methods Origin添加到POST和GET方法中.
两个调用都映射到相同的lambda函数,该函数只是将"Hello from Lambda"文本输出到控制台.
然后我创建了一个简单的html页面,我在S3上作为静态网站托管,使用Route53指向一个域,并开始使用jQuery $ .ajax测试API 来进行调用.
一切看起来都很简单,直截了当,正如文档中所解释的那样,除了GET工作并按预期将文本输出到控制台.该POST版本导致以下错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code …
有类似的问题,但他们有我尝试过的答案.我不确定我做错了什么,但任何帮助都会赞赏.
方法执行测试的错误; PUT请求:
Execution log for request test-request
Mon Oct 16 10:13:47 UTC 2017 : Starting execution for request: test-invoke-request
Mon Oct 16 10:13:47 UTC 2017 : HTTP Method: PUT, Resource Path: /pop-data-xmlz/test.xml
Mon Oct 16 10:13:47 UTC 2017 : Method request path: {item=test.xml, folder=pop-data-xmlz}
Mon Oct 16 10:13:47 UTC 2017 : Method request query string: {}
Mon Oct 16 10:13:47 UTC 2017 : Method request headers: {Content-Type=application/xml}
Mon Oct 16 10:13:47 UTC 2017 : Method request body before …Run Code Online (Sandbox Code Playgroud) 我有一个使用带有API网关扩展的 Swagger 2.0定义创建的API网关.
我覆盖了默认的API网关响应,例如:
x-amazon-apigateway-gateway-responses:
BAD_REQUEST_BODY:
statusCode: 400
responseTemplates:
application/json: |
{
"error": {
"code": 400,
"stage": "$context.stage",
"request": "$context.requestId",
"message": "$context.error.message"
}
}
Run Code Online (Sandbox Code Playgroud)
在$context上述有效载荷来自API网关变量.
我的API中的示例资源/方法如下所示(始终是LAMBDA_PROXY集成):
paths:
/test:
post:
parameters:
- in: body
name: Test
required: true
schema:
$ref: "#/definitions/Test"
responses:
201:
description: Created
400:
description: Bad Request
401:
description: Unauthorized
403:
description: Forbidden
x-amazon-apigateway-integration:
uri: >-
arn:aws:apigateway:${region}:lambda:path/2015-03-31/functions/${lambda}/invocations
type: aws_proxy
httpMethod: POST
credentials: "${credentials}"
passthroughBehavior: never
Run Code Online (Sandbox Code Playgroud)
使用相应的请求有效负载定义:
definitions:
Test:
type: …Run Code Online (Sandbox Code Playgroud) 我使用代理集成使用api网关暴露了多个lambdas.我不时会收到状态代码为502的奇怪错误.在lambda云监视日志中没有任何内容.下面我发布了api网关日志以获取示例请求:
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Received response. Integration latency: 231 ms
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response body before transformations:
{
"Message": "An error occurred and the request cannot be processed.",
"Type": "Service"
}
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response headers:
{
Connection=keep-alive,
x-amzn-RequestId=0cbc9dee-f1bd-11e7-857b-91f7f814692c,
x-amzn-ErrorType=ServiceException,
Content-Length=86,
Date=Fri, 05 Jan 2018 02:06:32 GMT,
Content-Type=application/json
}
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Execution failed due to configuration error: Malformed Lambda proxy response
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Method completed with status: 502
Run Code Online (Sandbox Code Playgroud)
基本上似乎api网关无法到达lambda并且调用lambda返回:
(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response body before transformations:
{
"Message": "An error occurred and the request cannot be processed.", …Run Code Online (Sandbox Code Playgroud) aws-api-gateway ×10
aws-lambda ×3
api ×2
cors ×2
python ×2
amazon-s3 ×1
flutter ×1
flutter-web ×1
swagger ×1