Aws Api gateway/Lambda python dynamodb 适用于邮递员但不适用于网页
Aws Api gateway/Lambda python dynamodb works with postman but doesn't with webpage
我有一个lambda_function.py
import json
from dynamodb import put_user
def lambda_handler(event, context):
data = json.loads(event["body"])
username = data["username"]
age = data["age"]
name = data["name"]
put_user(username,age,name)
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'OPTIONS,POST'
},
'body': json.dumps('Hello from Lambda!')
}
和dynamodb.py
from pprint import pprint
import boto3
def put_user(username, age, name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', region_name='us-east-2')
table = dynamodb.Table('UsersTable')
response = table.put_item(
Item={
'Username': username,
'Age': age,
'Name': name
}
)
return response
我用 POST 方法创建了一个 API 网关,当我从 POSTMAN 调用它时,该方法有效(并将一个项目放入 dynamodb table) .
但是,当我在我的 Flask 服务器 (/static/script.js) 中使用 javascript 提取时,我无法让它工作:
button.addEventListener('click', () => {
let body_info = {
"username" : username.textContent,
"age" : age.textContent,
"name" : Name.textContent
}
fetch(url, {
method: 'POST',
body: JSON.stringify(body_info),
headers: {
"Content-type": "application/json",
"Origin": origin2
}
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.log('Request failed', err))
})
Firefox Console error
我一直在尝试调试应用程序,发现如果评论
put_user(username,age,name)
然后 Firefox 控制台没有显示任何错误,我得到了
response from the api gateway
有什么想法吗?
您描述的是 CORS 错误。基本上,您的 Web 浏览器期望服务器 return CORS 标准要求的 HTTP headers,但它没有这样做。
确保 Enable CORS on your API Gateway 并重新部署 API,然后再次测试。
如果您的问题仍然存在,您可以尝试Returning CORS headers from your lambda function
问题是
button.addEventListener('click', () => {
let body_info = {
"username" : username.textContent,
"age" : age.textContent,
"name" : Name.textContent
}
是一个空对象,因为它是一个输入 html,其内容可以通过 .value 而不是 .textContent.
修复后,fetch 发送了一个有效的主体,apigateway、lambda 和 dynamodb 正确执行!
我有一个lambda_function.py
import json
from dynamodb import put_user
def lambda_handler(event, context):
data = json.loads(event["body"])
username = data["username"]
age = data["age"]
name = data["name"]
put_user(username,age,name)
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'OPTIONS,POST'
},
'body': json.dumps('Hello from Lambda!')
}
和dynamodb.py
from pprint import pprint
import boto3
def put_user(username, age, name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', region_name='us-east-2')
table = dynamodb.Table('UsersTable')
response = table.put_item(
Item={
'Username': username,
'Age': age,
'Name': name
}
)
return response
我用 POST 方法创建了一个 API 网关,当我从 POSTMAN 调用它时,该方法有效(并将一个项目放入 dynamodb table) .
但是,当我在我的 Flask 服务器 (/static/script.js) 中使用 javascript 提取时,我无法让它工作:
button.addEventListener('click', () => {
let body_info = {
"username" : username.textContent,
"age" : age.textContent,
"name" : Name.textContent
}
fetch(url, {
method: 'POST',
body: JSON.stringify(body_info),
headers: {
"Content-type": "application/json",
"Origin": origin2
}
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.log('Request failed', err))
})
Firefox Console error
我一直在尝试调试应用程序,发现如果评论
put_user(username,age,name)
然后 Firefox 控制台没有显示任何错误,我得到了 response from the api gateway
有什么想法吗?
您描述的是 CORS 错误。基本上,您的 Web 浏览器期望服务器 return CORS 标准要求的 HTTP headers,但它没有这样做。
确保 Enable CORS on your API Gateway 并重新部署 API,然后再次测试。
如果您的问题仍然存在,您可以尝试Returning CORS headers from your lambda function
问题是
button.addEventListener('click', () => {
let body_info = {
"username" : username.textContent,
"age" : age.textContent,
"name" : Name.textContent
}
是一个空对象,因为它是一个输入 html,其内容可以通过 .value 而不是 .textContent.
修复后,fetch 发送了一个有效的主体,apigateway、lambda 和 dynamodb 正确执行!