背景知识
在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类似。