背景知识
在Unity游戏开发中,一个常见场景是,后端扔过来一个Swagger后端接口网页,需要你使用对应的接口对应的接口发送和接收数据,如图所示为发起Get请求:
我们可以通过点击Try it out按钮直接在网页上测试收发数据(如果需要授权需要点击右上角的Authorize输入令牌)
那么在客户端的代码中如何完成这一功能呢?
在Http协议中,客户端发送的请求有Get、Post、Put、Delete等
一般来说,数据的发送和接收都需要经过序列化和反序列化的过程。这里以常用的Json格式数据为例,Unity中的对象数据转化为Json就是序列化的过程,反过来就是反序列化。
代码
简单的Get请求代码:
public class CharacterData{public string id { get; set; }public List<PersonalityData> personalities = new List<PersonalityData>();public int intimacy { get; set; }}public class PersonalityData{public string id { get; set; }public string character_id { get; set; }public bool available { get; set; }public int intimacy { get; set; }}public class Test : MonoBehaviour{IEnumerator Start(){// 域名+参数string url = "https://your-server-address/api/character?id=1";using (UnityWebRequest webRequest = UnityWebRequest.Get(url)){// 设置请求头,包含X-API-Key webRequest.SetRequestHeader("X-API-Key", "yourkey");webRequest.SetRequestHeader("Accept", "application/json");Debug.Log("sendMessage");// 发送请求并等待响应 yield return webRequest.SendWebRequest();string a = webRequest.downloadHandler.text;Debug.Log("Received JSON response: " + a);// 检查是否有错误发生 if (webRequest.result == UnityWebRequest.Result.Success){string jsonResponse = webRequest.downloadHandler.text;Debug.Log("Received JSON response: " + jsonResponse);CharacterData userData = JsonConvert.DeserializeObject<CharacterData>(jsonResponse);}else{Debug.LogError("Error: " + webRequest.error);}}Debug.Log(Get());}}
可以看到Http发起Get请求非常简单,把对应的参数包含在url中,把API-Key包含在请求头中即可,最后调用JsonConvert.DeserializeObject将得到的Json字符串转换成对象即可。
Post请求(Put请求同理):
以Form形式提交请求:
public class Test : MonoBehaviour
{ private string serverUrl = "http://your-server-address/api/resource"; // 替换为你的服务器地址 void Start() { StartCoroutine(PostData()); } IEnumerator PostData() { WWWForm form = new WWWForm(); form.AddField("field1", "value1"); form.AddField("field2", "value2"); using (UnityWebRequest webRequest = UnityWebRequest.Post(serverUrl, form)) { yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { string responseData = webRequest.downloadHandler.text; Debug.Log("Response: " + responseData); // 在这里处理服务器响应 } else { Debug.LogError("Error: " + webRequest.error); } } }
}
以Body形式提交请求,可以替换为:
IEnumerator PostJsonData()
{ string jsonData =JsonConvert.SerializeObject(param);byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData); using (UnityWebRequest webRequest = new UnityWebRequest(serverUrl, "POST")) { webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw); webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); webRequest.SetRequestHeader("Content-Type", "application/json"); yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { string responseData = webRequest.downloadHandler.text; Debug.Log("Response: " + responseData); // 在这里处理服务器响应 } else { Debug.LogError("Error: " + webRequest.error); } }
}
如果要发送一个DELETE请求,不需要上传任何数据体(Body),因为DELETE请求通常不包含请求体。用法与不带数据的Get类似。