You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:34:58