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);
}
}