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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑小星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值