UnityWebRequest仅特定输入生效,报500内部服务器错误求助
核心问题:请求格式与解析逻辑不兼容
你遇到的500错误本质是Unity发送的请求格式和Lambda的解析逻辑不匹配,而loginUser长度影响结果只是巧合:
1. Unity端请求格式错误
你的Unity代码把表单数据包装成了JSON字符串({"body": "loginUser=xxx&..."})传给UnityWebRequest.Post,但该方法默认会将这个字符串当作application/x-www-form-urlencoded类型的表单内容发送,而非JSON。这导致Lambda收到的event.body是整个JSON字符串,而非预期的纯表单数据。
2. Lambda解析逻辑的缺陷
你的parse_form_data函数直接将event.body按&和=拆分解析表单,但当event.body是JSON字符串时,拆分后会得到异常格式的参数(比如第一个拆分项是"{ \"body\": \"loginUser=fjkixrx",按=拆分后会得到3个元素),此时字典推导式{k: v for k, v in [...]}会抛出解包错误(需要2个值但得到多个),直接触发Lambda返回500。
而loginUser为7个字符时看似成功,大概率是测试时的巧合(比如日志未捕获隐性错误,或请求转义异常导致格式意外符合解析逻辑)。
排查与修复步骤
第一步:查看Lambda错误日志(关键)
登录AWS CloudWatch,找到对应Lambda的日志组,查看具体报错信息,肯定能看到类似ValueError: too many values to unpack (expected 2)的异常,这会直接验证上述结论。
第二步:统一请求与解析格式
任选以下一种方案即可:
方案A:Unity发送标准表单数据(推荐,匹配Lambda原有逻辑)
不要包装成JSON,直接用WWWForm构造表单:
WWWForm form = new WWWForm(); form.AddField("loginUser", "different"); form.AddField("loginPass", "secretpassword"); form.AddField("thirdoption", "example data"); using UnityWebRequest www = UnityWebRequest.Post(website, form);
也可手动构造表单字符串(需自行处理特殊字符转义,不推荐):
string formData = "loginUser=different&loginPass=secretpassword&thirdoption=example%20data"; using UnityWebRequest www = UnityWebRequest.Post(website, formData);
方案B:Unity发送JSON,Lambda适配解析
如果需要用JSON格式传输,Unity端需设置正确的请求头:
// 定义数据类 public class LoginData { public string loginUser; public string loginPass; public string thirdoption; } // 构造并序列化JSON LoginData data = new LoginData { loginUser = "different", loginPass = "secretpassword", thirdoption = "example data" }; string jsonBody = JsonUtility.ToJson(data); // 发送请求并设置Content-Type using UnityWebRequest www = UnityWebRequest.Post(website, jsonBody); www.SetRequestHeader("Content-Type", "application/json");
同时修改Lambda的parse_form_data函数,适配JSON解析:
def parse_form_data(event): """Parse form data from the event object""" form_data = {} if 'body' in event: try: # 优先按JSON解析 form_data = json.loads(event['body']) except json.JSONDecodeError: # 兼容原表单格式 form_data = {k: v for k, v in [param.split('=') for param in event['body'].split('&')]} return form_data
第三步:完善Lambda错误处理
在lambda_handler中添加异常捕获,避免未处理的错误直接返回500,同时输出详细日志便于排查:
def lambda_handler(event, context): """Extract form data from the POST request""" try: print("Received event:", json.dumps(event)) form_data = parse_form_data(event) if 'loginUser' in form_data and 'loginPass' in form_data: login_user = form_data['loginUser'] login_pass = form_data['loginPass'] print(f"Received login credentials - User: {login_user}, Password: {login_pass}") if 'thirdoption' in form_data: third_option = form_data['thirdoption'] print(f"Received third option data: {third_option}") return { 'statusCode': 200, 'body': json.dumps({'message': 'Form data received successfully'}) } except Exception as e: print(f"Error processing request: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({'message': 'Server error', 'error': str(e)}) }
内容的提问来源于stack exchange,提问作者Duncan Burns

