Unity客户端的Http通讯实战


背景知识

在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类似。


文章作者: 微笑紫瞳星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 微笑紫瞳星 !
评论
  目录