如何通过WWWForm向WebService传递HashSet?求替代实现方案
解决方案:Unity HashSet 传递到 PHP WebService
当然可以用WWWForm传递你的HashSet数据,甚至还有更灵活的替代方案,结合你说的列表长度大概20的场景,我给你两种实用的实现方式:
方法1:直接遍历HashSet添加到WWWForm
这是最直观的方式,PHP会自动把相同键名的表单字段识别为数组。我们只需要遍历HashSet里的每个元素,用同一个键名(比如user_items[])添加到表单里就行。
Unity 代码示例
using UnityEngine; using System.Collections.Generic; using UnityEngine.Networking; public class UserDataSender : MonoBehaviour { string CreateUserURL = "localhost:81/ARFUR/InsertUser.php"; void Start () { HashSet<string> userSet = new HashSet<string>(); // 模拟添加业务数据 userSet.Add("user_001"); userSet.Add("user_002"); userSet.Add("user_003"); // 开启协程发送数据(Unity网络请求必须在协程里执行) StartCoroutine(SendHashSetToPHP(userSet)); } IEnumerator SendHashSetToPHP(HashSet<string> dataSet) { WWWForm form = new WWWForm(); // 遍历HashSet,逐个添加到表单 foreach(string item in dataSet) { form.AddField("user_items[]", item); } // 用UnityWebRequest发送(比旧的WWW类更稳定,官方推荐) using(UnityWebRequest www = UnityWebRequest.Post(CreateUserURL, form)) { yield return www.SendWebRequest(); if(www.result != UnityWebRequest.Result.Success) { Debug.LogError("请求失败:" + www.error); } else { Debug.Log("数据发送成功!PHP返回:" + www.downloadHandler.text); } } } }
对应的PHP 处理代码
<?php // 检查是否接收到表单数据 if(isset($_POST['user_items'])){ $userItems = $_POST['user_items']; // $userItems 是一个包含所有HashSet元素的数组 foreach($userItems as $item){ echo "收到用户ID:" . $item . "<br>"; // 这里写你的插入数据库等业务逻辑 } echo "数据处理完成"; } else { echo "未接收到有效数据"; } ?>
方法2:序列化为JSON字符串传递
如果以后你的数据结构可能扩展(比如需要传递更复杂的对象),用JSON序列化的方式会更灵活。不过要注意:Unity自带的JsonUtility不能直接序列化HashSet,所以我们先把它转成List再序列化。
Unity 代码示例
using UnityEngine; using System.Collections.Generic; using UnityEngine.Networking; using System; public class UserDataSenderJSON : MonoBehaviour { string CreateUserURL = "localhost:81/ARFUR/InsertUser.php"; void Start () { HashSet<string> userSet = new HashSet<string>(); userSet.Add("user_001"); userSet.Add("user_002"); userSet.Add("user_003"); StartCoroutine(SendHashSetAsJSON(userSet)); } IEnumerator SendHashSetAsJSON(HashSet<string> dataSet) { // 把HashSet转成List,适配JsonUtility的序列化要求 List<string> userList = new List<string>(dataSet); // 用辅助类包装后序列化为JSON string jsonData = JsonUtility.ToJson(new JsonWrapper { items = userList }); WWWForm form = new WWWForm(); form.AddField("json_data", jsonData); using(UnityWebRequest www = UnityWebRequest.Post(CreateUserURL, form)) { yield return www.SendWebRequest(); if(www.result != UnityWebRequest.Result.Success) { Debug.LogError("JSON请求失败:" + www.error); } else { Debug.Log("JSON数据发送成功!PHP返回:" + www.downloadHandler.text); } } } // 辅助类:用来包装List,让JsonUtility可以正确序列化 [Serializable] private class JsonWrapper { public List<string> items; } }
对应的PHP 处理代码
<?php if(isset($_POST['json_data'])){ $jsonString = $_POST['json_data']; // 解码JSON为关联数组 $data = json_decode($jsonString, true); $userItems = $data['items']; foreach($userItems as $item){ echo "收到用户ID(JSON方式):" . $item . "<br>"; // 执行你的业务逻辑 } echo "JSON数据处理完成"; } else { echo "未接收到JSON数据"; } ?>
小提示
两种方法都完全适配你20个元素的场景:
- 方法1适合简单字符串集合,代码更简洁直观;
- 方法2适合未来可能扩展的复杂数据结构,通用性更强。
另外记得Unity里的网络请求必须放在协程里执行,不然会阻塞主线程哦~
内容的提问来源于stack exchange,提问作者Med yacine
相关产品推荐
相关产品推荐

