如何在AWS Lambda测试事件页测试XML请求并解决解析报错
解决Lambda API Proxy测试事件中发送XML请求体的解析错误
你的报错根源是Lambda函数代码尝试将event.body解析为JSON,但event.body实际是XML内容(转义后的<被JSON解析器判定为非法字符),导致解析失败。以下是具体解决方法:
一、正确构造测试事件
在API Proxy测试事件中,XML内容需以字符串形式放在body字段中,同时建议添加Content-Type头明确请求类型,示例如下:
{ "body": "<AgentSearchRequest><agentNumber></agentNumber><locNumber>023000</locNumber><applicationName>ISY</applicationName><companyNumber>0</companyNumber><subCompanyNumber>0</subCompanyNumber><futureUse></futureUse></AgentSearchRequest>", "resource": "/{proxy+}", "path": "/api/AgentSearchCore", "httpMethod": "POST", "headers": { "Content-Type": "application/xml" } }
注意:若XML内容包含双引号,需在JSON字符串中转义为\",你的示例XML无此情况,直接写入即可。
二、调整Lambda函数代码
不要将event.body当作JSON解析,改用XML解析库处理请求体,以下是两种主流语言的实现示例:
Python示例
import xml.etree.ElementTree as ET import json def lambda_handler(event, context): # 直接获取XML格式的请求体 xml_content = event["body"] try: # 解析XML内容 root = ET.fromstring(xml_content) # 提取所需字段(以locNumber为例) loc_number = root.find("locNumber").text return { "statusCode": 200, "headers": { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, "body": json.dumps({"locNumber": loc_number}) } except Exception as e: return { "statusCode": 400, "headers": { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, "body": json.dumps({"error": f"XML解析失败: {str(e)}"}) }
Node.js示例
const xml2js = require("xml2js"); exports.handler = async (event) => { const xmlContent = event.body; try { // 解析XML内容 const parsedXml = await xml2js.parseStringPromise(xmlContent); // 提取所需字段(以locNumber为例) const locNumber = parsedXml.AgentSearchRequest.locNumber[0]; return { statusCode: 200, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, body: JSON.stringify({ locNumber }) }; } catch (err) { return { statusCode: 400, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, body: JSON.stringify({ error: `XML解析失败: ${err.message}` }) }; } };
额外注意事项
- 确保API Gateway的集成请求配置中,没有强制将请求体转换为JSON(默认代理集成不会修改请求体)。
- 如果使用第三方XML解析库,需将库打包进Lambda部署包(Node.js可通过npm安装后打包,Python可通过pip安装到本地目录后打包)。
内容的提问来源于stack exchange,提问作者WorkJ
相关产品推荐
相关产品推荐

