在API网关上启用CORS后,这是我发送到http端点的请求:
$.ajax({
type: 'put',
url: 'https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/artist/application/julian_test',
data: {params: {param1: "543543", param2: "fdasghdfghdf", test: "yes"}},
success: function(msg){
console.log(msg);
},
error: function(msg){
console.log(msg);
}
});
这是lambda函数(我正在使用node serverless包,并且代码没有错误):
module.exports.julian_test = (event, context, callback) => {
console.log(event);
console.log(event.body);
var response_success = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({
firstUser: {
username: "Julian",
email: "awesome"
},
secondUser: {
username: "Victor",
email: "hello world"
},
thirdUser: {
username: "Peter",
email: "nice"
}
})
};
callback(null, response_success);
};
console.log(event.body)注销: PARAMS%5Bparam1%5D = 543543&安培; PARAMS%5Bparam2%5D = fdasghdfghdf&安培; PARAMS%5Btest%5D =是
,这不是我想要的格式。我检查了OPTIONS Integration Request / body mapping模板,这里是快照。
我试图删除“application / json”但之后我收到以下回复:
XMLHttpRequest无法加载https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/artist/application/julian_test。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为500。
有谁知道如何在后端lambda中获取原始字符串请求主体?请帮忙!
答案 0 :(得分:2)
屏幕截图适用于用于CORS的OPTIONS方法。
您的实际Lambda函数调用可能是通过POST方法进行的。请检查POST方法下的集成请求Body映射模板。如果设置为通过body(默认值),则输入请求中的正文应按原样传递给Lambda。
请使用API网关控制台中的测试功能查看输入如何转换为集成请求。这应该可以帮助您调试。
答案 1 :(得分:0)
这里有两件事:
首先,在您的API网关资源下,转到Method Response
并确保您对[{1}}映射有响应。
其次,在您的API网关资源下,转到200 OK
,在Integration Request
下选择Body Mapping Templates
,然后在模板文本编辑器中输入以下代码:
application/json
应用此选项后,您可以访问您的请求对象:(Node.js)
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"queryParams": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
},
"pathParams": {
#foreach($param in $input.params().path.keySet())
"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
#end
}
}
我花了一些时间来弄明白这一点,向Kenn Brodhagen道具说明: tutorial
答案 2 :(得分:0)
获得真实原始AWS Lambda请求的唯一方法是通过Stream for Handler Input。
根据文档:
输入有效负载必须是有效的JSON,但输出流没有此类限制。支持任何字节。
以Java流式传输AWS Lambda输入和输出的示例:
public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
int letter;
while((letter = inputStream.read()) != -1)
{
outputStream.write(Character.toUpperCase(letter));
}
}