using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using System.Runtime.CompilerServices; using System.Threading.Tasks; /// /// 网络请求工具 /// public static class WebRequest { public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation op) { var tcs = new TaskCompletionSource(); op.completed += (obj) => { tcs.SetResult(null); }; return tcs.Task.GetAwaiter(); } /// 发送请求 public static void Send(DataRequest request) { if (request.RequestType == WebRequestType.GET) { Get(request); } if (request.RequestType == WebRequestType.POSTFORM) { PostForm(request); } if (request.RequestType == WebRequestType.POSTJSON) { PostJson(request); } if (request.RequestType == WebRequestType.Texture) { Texture(request); } } public static async void Get(DataRequest request) { string url = request.Url; using UnityWebRequest web = UnityWebRequest.Get(url); await web.SendWebRequest(); bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web.downloadHandler); } public static async void PostForm(DataRequest request) { string url = request.Url; WWWForm form = request.Form; using UnityWebRequest web = UnityWebRequest.Post(url, form); await web.SendWebRequest(); bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web.downloadHandler); } public static async void PostJson(DataRequest request) { string url = request.Url; string json = request.Json; byte[] postBytes = System.Text.Encoding.Default.GetBytes(json); #if UNITY_2022 using UnityWebRequest web = UnityWebRequest.PostWwwForm(url, "POST"); #else using UnityWebRequest web = UnityWebRequest.Post(url, "POST"); #endif web.uploadHandler.Dispose(); web.uploadHandler = new UploadHandlerRaw(postBytes); web.SetRequestHeader("Content-Type", "application/json"); await web.SendWebRequest(); bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web.downloadHandler); } public static async void Texture(DataRequest request) { string url = request.Url; using UnityWebRequest web = UnityWebRequestTexture.GetTexture(url); await web.SendWebRequest(); bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web.downloadHandler); } } /// /// Web请求类型 /// public enum WebRequestType { /// GET GET = 0, /// POST 表单 POSTFORM = 1, /// POST Json POSTJSON = 2, /// GET 获取图片 Texture = 3 } /// /// 请求数据 /// public abstract class DataRequest { /// Web请求地址 public abstract string Url { get; } /// Web请求类型 public abstract WebRequestType RequestType { get; } /// 提交json数据 public virtual string Json { get; } /// 提交Form表单数据 public virtual WWWForm Form { get; } /// Web请求结果处理 public abstract void RequestResultHandle(bool isDone, DownloadHandler downloadHandler); } /// /// Get请求数据 /// public class DataRequestGet : DataRequest { public readonly string url; public Action OnError; public Action OnCallback; public override string Url => url; public override WebRequestType RequestType => WebRequestType.GET; /// Web Get请求数据 public DataRequestGet(string url, Action OnCallback = null) { this.url = url; this.OnCallback = OnCallback; } public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) { if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } OnCallback?.Invoke(downloadHandler.text); } } /// /// Post请求数据 /// public class DataRequestPost : DataRequest { public readonly string url; public readonly string json; public readonly WWWForm form; public readonly WebRequestType type; public Action OnError; public Action OnCallback; public override string Url => url; public override WebRequestType RequestType => type; public override string Json => json; public override WWWForm Form => form; /// Web Post请求 提交json数据 public DataRequestPost(string url, string json, Action OnCallback = null) { this.url = url; this.json = json; this.OnCallback = OnCallback; type = WebRequestType.POSTJSON; } /// Web Post请求 提交WWWForm数据 public DataRequestPost(string url, WWWForm form, Action OnCallback = null) { this.url = url; this.form = form; this.OnCallback = OnCallback; type = WebRequestType.POSTFORM; } public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) { if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } OnCallback?.Invoke(downloadHandler.text); } } /// /// Get下载 Texture /// public class DataRequestTexture : DataRequest { public readonly string url; public Action OnError; public Action OnCallback; public override string Url => url; public override WebRequestType RequestType => WebRequestType.Texture; /// Web Get请求 Texture public DataRequestTexture(string url, Action OnCallback = null) { this.url = url; this.OnCallback = OnCallback; } public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) { if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } DownloadHandlerTexture dht = downloadHandler as DownloadHandlerTexture; OnCallback?.Invoke(dht.texture); } }