Unity中的UnityWebRequest
UnityWebRequest
是Unity提供的一个强大的网络库,用于发送和接收与网络相关的数据。我们使用它来发送POST请求到一个REST API,并接收响应。
示例脚本概览
我们的脚本GetUrl
包含以下几个关键部分:
- APIRequestData类:用于序列化发送到服务器的数据。
- ServerResponse类:用于反序列化从服务器接收的响应。
- 发送请求:使用
UnityWebRequest
发送JSON格式的POST请求。 - 处理中文编码:特别处理从API接收的包含中文的JSON字符串。
发送和接收JSON数据
SendRequest
方法演示了如何构造一个JSON对象,并将其作为POST请求的一部分发送到服务器。该方法使用了Unity的JsonUtility
来序列化请求数据。接收到的响应同样是JSON格式,我们使用了Newtonsoft.Json
来进行反序列化,这是因为它提供了比JsonUtility
更强大的功能,特别是在处理复杂对象时。
处理Unicode编码
从API接收的响应可能包含Unicode编码的中文字符,直接在Unity中显示这些字符可能会遇到问题。为了解决这一问题,我们实现了ConvertUnicodeJsonToChinese
方法,它使用Regex.Unescape
来将Unicode编码转换为可读的中文字符。这保证了无论API如何返回中文数据,用户都能在游戏中看到正确的中文文本。
调用示例
GetUrl
脚本提供了一个talk
公共方法,允许外部触发请求。在实际游戏中,这可以连接到UI元素,如按钮的点击事件。
完整脚本功能
此脚本不仅处理了网络请求和响应,还包括了错误处理逻辑,确保在发生连接错误或数据处理异常时,能够给予适当的反馈。
using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using System.Collections;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using System;
public class GetUrl : MonoBehaviour
{
public Text targetText;
private string apiUrl = "http://"; // 替换为实际的API端点URL
void Start()
{
}
public void talk(string word)
{
StartCoroutine(SendRequest("你是导游机器人。"
,
word));
}
IEnumerator SendRequest(string system, string user)
{
// 创建一个新的JSON对象
string jsonPayload = JsonUtility.ToJson(new APIRequestData
{
system = system,
user = user
});
// 创建一个新的UnityWebRequest,并设置方法和上传的JSON数据
using (UnityWebRequest webRequest = new UnityWebRequest(apiUrl, "POST"))
{
byte[] jsonToSend = new UTF8Encoding().GetBytes(jsonPayload);
webRequest.uploadHandler = new UploadHandlerRaw(jsonToSend);
webRequest.downloadHandler = new DownloadHandlerBuffer();
webRequest.SetRequestHeader("Content-Type", "application/json");
// 等待请求发送并接收响应
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error: " + webRequest.error);
}
else
{
targetText.text = ConvertUnicodeJsonToChinese(webRequest.downloadHandler.text);
Debug.Log(ConvertUnicodeJsonToChinese(webRequest.downloadHandler.text));
}
}
}
string ConvertUnicodeJsonToChinese(string jsonString)
{
string decodedString = Regex.Unescape(jsonString);
//Debug.Log(decodedString);
return ProcessResponse(decodedString);
}
string ProcessResponse(string json)
{
try
{
ServerResponse response = JsonConvert.DeserializeObject<ServerResponse>(json);
return response.response; // 输出 response 字段
}
catch (JsonException e)
{
Debug.LogError("JSON Parse Error: " + e.Message);
return "error";
}
}
// 用于序列化JSON的类
[System.Serializable]
public class APIRequestData
{
public string system;
public string user;
}
[Serializable]
public class ServerResponse
{
public string response;
public int status_code;
}