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

Unity C#发送PUT请求时服务端接收Body为空问题排查

为什么PUT请求体为空?及合规解决方案

我来帮你排查这个问题——之前我在做Unity和Node.js交互的时候也碰到过类似的请求体为空的情况,主要是两端的请求配置没匹配上,咱们一步步拆解:

一、请求体为空的核心原因

这些是最常见的几个诱因:

  • Unity端未正确配置请求头与请求体:如果没告诉服务端你发送的是JSON格式数据,或者没把用户信息序列化为JSON字节流,服务端根本无法识别请求体内容;
  • Node.js端缺少请求体解析中间件:Express框架默认不会自动解析JSON格式的请求体,如果没添加对应中间件,req.body自然是空的;
  • Unity请求构建错误:比如用UnityWebRequest时,没正确附加请求体内容(比如漏设UploadHandler,或者用了错误的请求方法重载)。

二、合规的解决方案(JSON请求体传递)

下面是两端的标准实现代码,完全符合RESTful规范:

1. Unity C# 端代码

用UnityWebRequest构建PUT请求,正确序列化JSON并设置请求头:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Text;

public class PasswordUpdateManager : MonoBehaviour
{
    // 替换成你的服务端基础域名
    private readonly string _uriBase = "http://your-server-domain.com";

    // 调用这个方法发起更新请求
    public IEnumerator UpdateUserPassword(string username, string oldPwd, string newPwd)
    {
        // 构建要发送的数据对象
        var updateData = new UpdatePasswordRequest
        {
            username = username,
            oldPassword = oldPwd,
            newPassword = newPwd
        };

        // 序列化为JSON字符串
        string jsonPayload = JsonUtility.ToJson(updateData);
        // 转换为UTF8字节数组
        byte[] bodyBytes = Encoding.UTF8.GetBytes(jsonPayload);

        using (var request = UnityWebRequest.Put($"{_uriBase}/api/user/update-password", bodyBytes))
        {
            // 关键:设置Content-Type,告诉服务端这是JSON数据
            request.SetRequestHeader("Content-Type", "application/json");

            // 发送请求并等待响应
            yield return request.SendWebRequest();

            if (request.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"更新请求失败:{request.error}");
            }
            else
            {
                Debug.Log("密码更新成功!");
                // 解析服务端响应(可选)
                string responseJson = request.downloadHandler.text;
                var response = JsonUtility.FromJson<UpdatePasswordResponse>(responseJson);
                Debug.Log(response.message);
            }
        }
    }

    // 用于序列化/反序列化的辅助类
    [System.Serializable]
    private class UpdatePasswordRequest
    {
        public string username;
        public string oldPassword;
        public string newPassword;
    }

    [System.Serializable]
    private class UpdatePasswordResponse
    {
        public string message;
        public bool success;
    }
}

2. Node.js + Express 端代码

确保添加JSON解析中间件,并正确处理PUT请求:

const express = require('express');
const mongoose = require('mongoose');
const app = express();

// ********* 关键!添加JSON请求体解析中间件 *********
// 没有这一行,req.body会永远是空的!
app.use(express.json());

// 连接MongoDB(替换成你的数据库地址)
mongoose.connect('mongodb://localhost:27017/your-database-name')
    .then(() => console.log('已连接MongoDB'))
    .catch(err => console.error('MongoDB连接失败:', err));

// 定义用户模型(根据你的实际集合结构调整)
const User = mongoose.model('User', {
    username: { type: String, required: true, unique: true },
    password: { type: String, required: true }
});

// PUT接口:处理密码更新
app.put('/api/user/update-password', async (req, res) => {
    try {
        // 从请求体获取参数
        const { username, oldPassword, newPassword } = req.body;

        // 验证旧密码是否正确
        const targetUser = await User.findOne({ username, password: oldPassword });
        if (!targetUser) {
            return res.status(400).json({ success: false, message: '用户名或旧密码错误' });
        }

        // 更新密码并保存
        targetUser.password = newPassword;
        await targetUser.save();

        res.json({ success: true, message: '密码更新成功' });
    } catch (err) {
        res.status(500).json({ success: false, message: '服务端错误', error: err.message });
    }
});

// 启动服务
const PORT = 3000;
app.listen(PORT, () => console.log(`服务运行在端口 ${PORT}`));

三、额外注意事项

  • 安全问题:一定要用HTTPS传输敏感数据(比如密码),避免明文泄露;
  • 数据验证:两端都要对输入数据做校验(比如密码长度、格式),避免无效请求;
  • Unity版本兼容:如果是旧版本Unity,UnityWebRequest.Put的重载可能有差异,确保使用支持传递bodyRaw的版本。

内容的提问来源于stack exchange,提问作者user3648673

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:32:24