RequestAsync.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System.Threading.Tasks;
  2. using UnityEngine;
  3. using UnityEngine.Networking;
  4. namespace WS
  5. {
  6. [ObjectSystem]
  7. public class RequestAsyncUpdate : UpdateSystem<RequestAsync>
  8. {
  9. public override void Update(RequestAsync self)
  10. {
  11. self.Update();
  12. }
  13. }
  14. ///<summary>Web请求代理</summary>
  15. public class RequestAsync : WSComponent
  16. {
  17. ///<summary>HTTP请求</summary>
  18. public UnityWebRequest Request;
  19. ///<summary>取消</summary>
  20. public bool isCancel;
  21. ///<summary>异步</summary>
  22. private TaskCompletionSource<bool> tcs;
  23. public override void Dispose()
  24. {
  25. base.Dispose();
  26. Request?.Dispose();
  27. Request = null;
  28. isCancel = false;
  29. tcs = null;
  30. }
  31. ///<summary>进度</summary>
  32. public float Progress
  33. {
  34. get
  35. {
  36. if (Request == null)
  37. return 0;
  38. return Request.downloadProgress;
  39. }
  40. }
  41. ///<summary>请求的字节数</summary>
  42. public ulong ByteDownloaded
  43. {
  44. get
  45. {
  46. if (Request == null)
  47. return 0;
  48. return Request.downloadedBytes;
  49. }
  50. }
  51. public void Update()
  52. {
  53. if (isCancel)
  54. {
  55. tcs.SetResult(false);
  56. return;
  57. }
  58. if (!Request.isDone)
  59. {
  60. return;
  61. }
  62. if (!string.IsNullOrEmpty(Request.error))
  63. {
  64. tcs.SetResult(true);
  65. return;
  66. }
  67. tcs.SetResult(true);
  68. }
  69. /// <summary>Get请求</summary>
  70. public Task<bool> GetAsync(string url, params string[] header)
  71. {
  72. tcs = new TaskCompletionSource<bool>();
  73. Request = UnityWebRequest.Get(url);
  74. Request.timeout = RequestComponent.OutTime;
  75. RequestComponent.Instance.SetHeader(header, Request);
  76. Request.SendWebRequest();
  77. return tcs.Task;
  78. }
  79. ///<summary>Post请求</summary>
  80. public Task<bool> PostAsync(string url, string json, params string[] header)
  81. {
  82. tcs = new TaskCompletionSource<bool>();
  83. byte[] postBytes = System.Text.Encoding.Default.GetBytes(json);
  84. Request = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST);
  85. Request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
  86. Request.SetRequestHeader("Content-Type", "application/json");
  87. Request.timeout = RequestComponent.OutTime;
  88. RequestComponent.Instance.SetHeader(header, Request);
  89. Request.SendWebRequest();
  90. return tcs.Task;
  91. }
  92. ///<summary>Post请求</summary>
  93. public Task<bool> PostAsync(string url, WWWForm form, params string[] header)
  94. {
  95. tcs = new TaskCompletionSource<bool>();
  96. Request = UnityWebRequest.Post(url, form);
  97. Request.timeout = RequestComponent.OutTime;
  98. RequestComponent.Instance.SetHeader(header, Request);
  99. Request.SendWebRequest();
  100. return tcs.Task;
  101. }
  102. }
  103. }