UnityWebRequest POST至PHP失败:$_POST为空问题求助
解决Unity 2017.3中UnityWebRequest POST到PHP时$_POST为空的问题
我之前也踩过Unity版本迁移的这个坑,2017系列对UnityWebRequest的处理逻辑确实和5.x有不少细节差异,咱们一步步来排查解决:
1. 先确认Unity端的请求写法是否合规
Unity 2017.3里UnityWebRequest.Send()已经被废弃,官方推荐用SendWebRequest()替代,旧方法可能存在兼容性问题。给你一个标准的POST请求示例,你可以对照调整:
IEnumerator SendPostRequest() { WWWForm form = new WWWForm(); // 添加普通表单字段 form.AddField("user_id", "123"); form.AddField("message", "hello from unity"); using (UnityWebRequest www = UnityWebRequest.Post("http://your-domain/your-script.php", form)) { yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.LogError("请求出错:" + www.error); } else { Debug.Log("请求成功,响应内容:" + www.downloadHandler.text); } } }
2. 排查PHP服务端的接收逻辑
很多时候问题出在服务端而非Unity:
- 先试试用
file_get_contents('php://input')获取原始请求数据,判断Unity的请求是否真的到达了服务端。比如在PHP脚本开头加这段代码:
// 打印原始请求内容,排查数据是否到达 $rawRequest = file_get_contents('php://input'); var_dump("原始请求数据:", $rawRequest); var_dump("POST数组:", $_POST);
如果$rawRequest有内容但$_POST为空,大概率是PHP的配置问题:比如post_max_size或upload_max_filesize设置太小,或者服务器禁用了multipart/form-data的解析。
- 另外,确认PHP脚本没有开启严格的跨域拦截,或者你的请求域名在允许的跨域列表里。
3. 针对MULTIPART上传的特殊处理
如果是带文件的MULTIPART上传,Unity自动生成的请求头可能和PHP的解析预期不匹配,可以手动指定Content-Type(注意boundary必须和WWWForm生成的一致):
// 在创建UnityWebRequest后添加这行代码 www.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + form.boundary);
4. 对比新旧版本的请求差异
你可以用抓包工具(比如Fiddler、Charles)分别抓取Unity 5.6和2017.3发送的请求,对比两者的请求头、Content-Length等字段。我之前就是通过抓包发现,新版本UnityWebRequest默认少了一个关键的头字段,手动补充后就解决了$_POST为空的问题。
按上面的步骤逐一排查,应该能定位到问题根源。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

