1. 关键代码 

1.1 协程实现

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
 
public class WebRequest : MonoBehaviour
{
    /// <summary>
    /// GET请求
    /// </summary>
    /// <param name="url">请求地址</param>
    /// <param name="callback">请求完成回调</param>
    public void Get(string url, Action<bool,string> callback)
    {
        StartCoroutine(CoroutineGetRequest(url, callback));
    }
 
    /// <summary>
    /// POST请求
    /// </summary>
    /// <param name="url">请求地址</param>
    /// <param name="postData">上传的数据</param>
    /// <param name="requestHeader">请求头[application/json]</param>
    /// <param name="callback">请求完成回调</param>
    /// application/json
    public void Post(string url, string postData,string requestHeader,Action<bool,string> callback)
    {
        StartCoroutine(CoroutinePostRequest(url, postData,requestHeader,callback));
    }
     
     
    IEnumerator CoroutineGetRequest(string url,Action<bool,string> callback)
    {
        // 使用UnityWebRequest发送一个GET请求
        using UnityWebRequest request = UnityWebRequest.Get(url);
        // 发送请求并等待结果
        yield return request.SendWebRequest();
        // 判断请求结果是否成功
        if (request.result != UnityWebRequest.Result.Success)
        {
            // 请求不成功,通过回调函数返回失败状态和错误信息
            callback?.Invoke(false, request.error);
        }
        else
        {
            // 获取响应消息
            string responseMessage = request.downloadHandler.text;
            // 调用回调函数并传入true和响应消息
            callback?.Invoke(true, responseMessage);
        }
    }
     
    IEnumerator CoroutinePostRequest(string url,string postData,string requestHeader,Action<bool,string> callback)
    {
        // 创建UnityWebRequest实例
        using UnityWebRequest request = new UnityWebRequest(url, "POST");
        // 将POST数据转换为字节数组
        byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(postData);
        // 设置上传处理程序为UploadHandlerRaw
        request.uploadHandler = new UploadHandlerRaw(bodyRaw);
        // 设置下载处理程序为DownloadHandlerBuffer
        request.downloadHandler = new DownloadHandlerBuffer();
        // 设置请求头的Content-Type
        request.SetRequestHeader("Content-Type", requestHeader);
        // 发送请求并等待结果
        yield return request.SendWebRequest();
 
        // 判断请求结果是否成功
        if (request.result != UnityWebRequest.Result.Success)
        {
            // 请求不成功,通过回调函数返回失败状态和错误信息
            callback?.Invoke(false, request.error);
        }
        else
        {
            // 请求成功,通过回调函数返回成功状态和响应消息
            string responseMessage = request.downloadHandler.text;
            callback?.Invoke(true, responseMessage);
        }
    }
}

1.2 原生C#实现 

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public class WebRequest
{
    #region 异步请求
    /// <summary>
    /// 异步GET请求
    /// </summary>
    /// <param name="url"></param>
    /// <param name="requestComplete"></param>
    /// <returns></returns>
    public async void AsyncGet(string url, Action<bool, string> requestComplete)
    {
        var result =await AsyncGetRequest(url);
        requestComplete?.Invoke(result.Item1, result.Item2);
    }
    
    /// <summary>
    /// 异步POST请求
    /// </summary>
    /// <param name="url"></param>
    /// <param name="postData"></param>
    /// <param name="requestHeader"></param>
    /// <param name="requestComplete"></param>
    public async void AsyncPost(string url, string postData, string requestHeader, Action<bool, string> requestComplete)
    {
        var result = await AsyncPostRequest(url, postData, requestHeader);
        requestComplete?.Invoke(result.Item1, result.Item2);
    }
    
    private static async Task<(bool, string)> AsyncGetRequest(string url)
    {
        var tcs = new TaskCompletionSource<(bool, string)>();
        HttpClient client = new HttpClient();
        try
        {
            // 发送GET请求获取响应
            HttpResponseMessage response = await client.GetAsync(url);
            // 如果响应成功
            if (response.IsSuccessStatusCode)
            {
                // 读取响应体并设置结果为true和响应体
                string responseBody = await response.Content.ReadAsStringAsync();
                tcs.SetResult((true, responseBody));
            }
            // 如果响应失败
            else
            {
                // 设置结果为false和响应原因
                tcs.SetResult((false, response.ReasonPhrase));
            }
        }
        // 捕获所有异常并设置结果为false和异常消息
        catch (Exception ex)
        {
            tcs.SetResult((false, ex.Message));
        }
        // 不管是否发生异常,最后都释放 HttpClient 的资源
        finally
        {
            client.Dispose();
        }
        // 返回异步任务的结果
        return await tcs.Task;
    }
    
    private async Task<(bool, string)> AsyncPostRequest(string url, string postData, string requestHeader)
    {
        // 创建一个TaskCompletionSource对象,用于创建任务并设置任务结果
        var tcs = new TaskCompletionSource<(bool, string)>();
        // 创建一个HttpClient对象,用于发送HTTP请求
        HttpClient client = new HttpClient();
        try
        {
            // 创建一个StringContent对象,用于设置请求体内容和编码类型
            StringContent content = new StringContent(postData, Encoding.UTF8, requestHeader);
            // 向请求头添加一个自定义的请求头
            client.DefaultRequestHeaders.Add("CustomHeader", requestHeader);
            // 发送POST请求,并获取响应结果
            HttpResponseMessage response = await client.PostAsync(url, content);
            // 判断请求是否成功
            if (response.IsSuccessStatusCode)
            {
                // 读取返回的内容
                string responseBody = await response.Content.ReadAsStringAsync();
                // 设置TaskCompletionSource对象的任务结果为成功,并传递返回的内容
                tcs.SetResult((true, responseBody));
            }
            else
            {
                // 设置TaskCompletionSource对象的任务结果为失败,并传递错误信息
                tcs.SetResult((false, response.ReasonPhrase));
            }
        }
        catch (Exception ex)
        {
            // 发生异常时,设置TaskCompletionSource对象的任务结果为失败,并传递异常信息
            tcs.SetResult((false, ex.Message));
        }
        finally
        {
            // 释放HttpClient对象的资源
            client.Dispose();
        }
        // 返回异步任务的结果
        return await tcs.Task;
    }
    #endregion
}

2. 示例代码

using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    [SerializeField] private WebRequest webRequest;
 
    private void Start()
    {
        GetData();
        PostData();
    }
 
 
    void GetData()
    {
        webRequest.Get("https://api.52vmy.cn/api/wl/mingyan", (isComplete, message) =>
        {
            if (isComplete)
            {
                Debug.Log(message);
            }
            else
            {
                Debug.LogError(message);
            }
        });
    }
 
 
    void PostData()
    {
        Data postData = new Data()
        {
            word = "天"
        };
        string body = JsonUtility.ToJson(postData);
        webRequest.Post($"https://api.pearktrue.cn/api/word/parse.php",body,"application/json", (isComplete,message) =>
        {
            if (isComplete)
            {
                Debug.Log(message);
            }
            else
            {
                Debug.LogError(message);
            }
        });
    }
 
    [System.Serializable]
    private class Data
    {
        public string word;
    }
}

 

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐