Skip to content

Commit 06b701c

Browse files
committed
feat(Web): 添加基础请求数据管理和合并功能
添加基础表单、请求头和查询参数的管理功能,并实现与请求数据的自动合并
1 parent 9282f4d commit 06b701c

4 files changed

Lines changed: 272 additions & 5 deletions

File tree

Runtime/Web/IWebManager.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Collections.Generic;
1+
using System.Collections.Generic;
22
using System.Threading.Tasks;
33

44
namespace GameFrameX.Web.Runtime
@@ -142,5 +142,59 @@ public interface IWebManager
142142
/// 超时时间
143143
/// </summary>
144144
float Timeout { get; set; }
145+
146+
/// <summary>
147+
/// 添加基础表单数据
148+
/// </summary>
149+
/// <param name="key">表单键</param>
150+
/// <param name="value">表单值</param>
151+
void AddBaseForm(string key, object value);
152+
153+
/// <summary>
154+
/// 移除基础表单数据
155+
/// </summary>
156+
/// <param name="key">表单键</param>
157+
void RemoveBaseForm(string key);
158+
159+
/// <summary>
160+
/// 清空基础表单数据
161+
/// </summary>
162+
void ClearBaseForm();
163+
164+
/// <summary>
165+
/// 添加基础请求头数据
166+
/// </summary>
167+
/// <param name="key">请求头键</param>
168+
/// <param name="value">请求头值</param>
169+
void AddBaseHeader(string key, string value);
170+
171+
/// <summary>
172+
/// 移除基础请求头数据
173+
/// </summary>
174+
/// <param name="key">请求头键</param>
175+
void RemoveBaseHeader(string key);
176+
177+
/// <summary>
178+
/// 清空基础请求头数据
179+
/// </summary>
180+
void ClearBaseHeader();
181+
182+
/// <summary>
183+
/// 添加基础查询参数数据
184+
/// </summary>
185+
/// <param name="key">查询参数键</param>
186+
/// <param name="value">查询参数值</param>
187+
void AddBaseQueryString(string key, string value);
188+
189+
/// <summary>
190+
/// 移除基础查询参数数据
191+
/// </summary>
192+
/// <param name="key">查询参数键</param>
193+
void RemoveBaseQueryString(string key);
194+
195+
/// <summary>
196+
/// 清空基础查询参数数据
197+
/// </summary>
198+
void ClearBaseQueryString();
145199
}
146200
}

Runtime/Web/WebManager.Binary.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Net;
@@ -104,6 +104,14 @@ private async void MakeBinaryBytesRequest(WebBinaryData webData)
104104
unityWebRequest.uploadHandler = new UploadHandlerRaw(postData);
105105
}
106106

107+
if (webData.Header != null && webData.Header.Count > 0)
108+
{
109+
foreach (var kv in webData.Header)
110+
{
111+
unityWebRequest.SetRequestHeader(kv.Key, kv.Value);
112+
}
113+
}
114+
107115
var asyncOperation = unityWebRequest.SendWebRequest();
108116
asyncOperation.completed += (asyncOperation2) =>
109117
{
@@ -130,6 +138,14 @@ private async void MakeBinaryBytesRequest(WebBinaryData webData)
130138
await requestStream.WriteAsync(postData, 0, postData.Length);
131139
}
132140

141+
if (webData.Header != null && webData.Header.Count > 0)
142+
{
143+
foreach (var kv in webData.Header)
144+
{
145+
request.Headers[kv.Key] = kv.Value;
146+
}
147+
}
148+
133149
using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
134150
{
135151
using (Stream responseStream = response.GetResponseStream())
@@ -181,8 +197,10 @@ private async void MakeBinaryBytesRequest(WebBinaryData webData)
181197
public Task<WebBufferResult> PostToBytes(string url, byte[] from, Dictionary<string, string> queryString, Dictionary<string, string> header, object userData = null)
182198
{
183199
var uniTaskCompletionSource = new TaskCompletionSource<WebBufferResult>();
200+
queryString = MergeQueryString(queryString);
201+
header = MergeHeader(header);
184202
url = UrlHandler(url, queryString);
185-
var webData = new WebBinaryData(url, from, uniTaskCompletionSource, userData);
203+
var webData = new WebBinaryData(url, header, from, uniTaskCompletionSource, userData);
186204
m_SendingBinaryList.Add(webData);
187205
MakeBinaryBytesRequest(webData);
188206
return uniTaskCompletionSource.Task;

Runtime/Web/WebManager.WebBinaryData.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
23
using GameFrameX.Runtime;
34

45
namespace GameFrameX.Web.Runtime
@@ -20,18 +21,25 @@ private sealed class WebBinaryData : WebData
2021
/// </summary>
2122
public readonly byte[] SendData;
2223

24+
/// <summary>
25+
/// 获取请求头信息
26+
/// </summary>
27+
public readonly Dictionary<string, string> Header;
28+
2329
/// <summary>
2430
/// 初始化Web Binary请求数据
2531
/// </summary>
2632
/// <param name="url">请求URL</param>
33+
/// <param name="header">请求头信息</param>
2734
/// <param name="sendData">要发送的Binary序列化数据</param>
2835
/// <param name="task">请求任务的完成源</param>
2936
/// <param name="userData">用户自定义数据</param>
30-
public WebBinaryData(string url, byte[] sendData, TaskCompletionSource<WebBufferResult> task, object userData) : base(false, url, userData)
37+
public WebBinaryData(string url, Dictionary<string, string> header, byte[] sendData, TaskCompletionSource<WebBufferResult> task, object userData) : base(false, url, userData)
3138
{
3239
task.CheckNull(nameof(task));
3340
SendData = sendData;
3441
Task = task;
42+
Header = header;
3543
}
3644
}
3745
}

Runtime/Web/WebManager.cs

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public partial class WebManager : GameFrameworkModule, IWebManager
3737
// 超时时间(秒)
3838
private float m_Timeout = 5f;
3939

40+
private readonly Dictionary<string, object> m_BaseForm = new Dictionary<string, object>(64);
41+
private readonly Dictionary<string, string> m_BaseHeader = new Dictionary<string, string>(64);
42+
private readonly Dictionary<string, string> m_BaseQueryString = new Dictionary<string, string>(64);
43+
4044
/// <summary>
4145
/// 构造函数
4246
/// </summary>
@@ -188,6 +192,8 @@ public Task<WebBufferResult> GetToBytes(string url, Dictionary<string, string> q
188192
public Task<WebStringResult> GetToString(string url, Dictionary<string, string> queryString, Dictionary<string, string> header, object userData = null)
189193
{
190194
var uniTaskCompletionSource = new TaskCompletionSource<WebStringResult>();
195+
queryString = MergeQueryString(queryString);
196+
header = MergeHeader(header);
191197
url = UrlHandler(url, queryString);
192198

193199
WebJsonData webJsonData = new WebJsonData(url, header, true, uniTaskCompletionSource, userData);
@@ -465,6 +471,8 @@ private async void MakeJsonBytesRequest(WebJsonData webJsonData)
465471
public Task<WebBufferResult> GetToBytes(string url, Dictionary<string, string> queryString, Dictionary<string, string> header, object userData = null)
466472
{
467473
var uniTaskCompletionSource = new TaskCompletionSource<WebBufferResult>();
474+
queryString = MergeQueryString(queryString);
475+
header = MergeHeader(header);
468476
url = UrlHandler(url, queryString);
469477

470478
WebJsonData webJsonData = new WebJsonData(url, header, true, uniTaskCompletionSource, userData);
@@ -539,6 +547,9 @@ public Task<WebBufferResult> PostToBytes(string url, Dictionary<string, object>
539547
public Task<WebStringResult> PostToString(string url, Dictionary<string, object> from, Dictionary<string, string> queryString, Dictionary<string, string> header, object userData = null)
540548
{
541549
var uniTaskCompletionSource = new TaskCompletionSource<WebStringResult>();
550+
from = MergeForm(from);
551+
queryString = MergeQueryString(queryString);
552+
header = MergeHeader(header);
542553
url = UrlHandler(url, queryString);
543554

544555
WebJsonData webJsonData = new WebJsonData(url, header, from, uniTaskCompletionSource, userData);
@@ -559,12 +570,188 @@ public Task<WebStringResult> PostToString(string url, Dictionary<string, object>
559570
public Task<WebBufferResult> PostToBytes(string url, Dictionary<string, object> from, Dictionary<string, string> queryString, Dictionary<string, string> header, object userData = null)
560571
{
561572
var uniTaskCompletionSource = new TaskCompletionSource<WebBufferResult>();
573+
from = MergeForm(from);
574+
queryString = MergeQueryString(queryString);
575+
header = MergeHeader(header);
562576
url = UrlHandler(url, queryString);
563577
WebJsonData webJsonData = new WebJsonData(url, header, from, uniTaskCompletionSource, userData);
564578
m_WaitingNormalQueue.Enqueue(webJsonData);
565579
return uniTaskCompletionSource.Task;
566580
}
567581

582+
#region Base Data Management
583+
584+
/// <summary>
585+
/// 添加基础表单数据
586+
/// </summary>
587+
/// <param name="key">表单键</param>
588+
/// <param name="value">表单值</param>
589+
public void AddBaseForm(string key, object value)
590+
{
591+
m_BaseForm[key] = value;
592+
}
593+
594+
/// <summary>
595+
/// 移除基础表单数据
596+
/// </summary>
597+
/// <param name="key">表单键</param>
598+
public void RemoveBaseForm(string key)
599+
{
600+
if (m_BaseForm.ContainsKey(key))
601+
{
602+
m_BaseForm.Remove(key);
603+
}
604+
}
605+
606+
/// <summary>
607+
/// 清空基础表单数据
608+
/// </summary>
609+
public void ClearBaseForm()
610+
{
611+
m_BaseForm.Clear();
612+
}
613+
614+
/// <summary>
615+
/// 添加基础请求头数据
616+
/// </summary>
617+
/// <param name="key">请求头键</param>
618+
/// <param name="value">请求头值</param>
619+
public void AddBaseHeader(string key, string value)
620+
{
621+
m_BaseHeader[key] = value;
622+
}
623+
624+
/// <summary>
625+
/// 移除基础请求头数据
626+
/// </summary>
627+
/// <param name="key">请求头键</param>
628+
public void RemoveBaseHeader(string key)
629+
{
630+
if (m_BaseHeader.ContainsKey(key))
631+
{
632+
m_BaseHeader.Remove(key);
633+
}
634+
}
635+
636+
/// <summary>
637+
/// 清空基础请求头数据
638+
/// </summary>
639+
public void ClearBaseHeader()
640+
{
641+
m_BaseHeader.Clear();
642+
}
643+
644+
/// <summary>
645+
/// 添加基础查询参数数据
646+
/// </summary>
647+
/// <param name="key">查询参数键</param>
648+
/// <param name="value">查询参数值</param>
649+
public void AddBaseQueryString(string key, string value)
650+
{
651+
m_BaseQueryString[key] = value;
652+
}
653+
654+
/// <summary>
655+
/// 移除基础查询参数数据
656+
/// </summary>
657+
/// <param name="key">查询参数键</param>
658+
public void RemoveBaseQueryString(string key)
659+
{
660+
if (m_BaseQueryString.ContainsKey(key))
661+
{
662+
m_BaseQueryString.Remove(key);
663+
}
664+
}
665+
666+
/// <summary>
667+
/// 清空基础查询参数数据
668+
/// </summary>
669+
public void ClearBaseQueryString()
670+
{
671+
m_BaseQueryString.Clear();
672+
}
673+
674+
#endregion
675+
676+
#region Data Merging
677+
678+
/// <summary>
679+
/// 合并表单数据
680+
/// </summary>
681+
/// <param name="form">本次请求的表单数据</param>
682+
/// <returns>合并后的表单数据</returns>
683+
private Dictionary<string, object> MergeForm(Dictionary<string, object> form)
684+
{
685+
if (m_BaseForm.Count == 0)
686+
{
687+
return form;
688+
}
689+
690+
// 复制基础数据
691+
var result = new Dictionary<string, object>(m_BaseForm);
692+
693+
// 覆盖/添加外部数据
694+
if (form != null)
695+
{
696+
foreach (var kv in form)
697+
{
698+
result[kv.Key] = kv.Value;
699+
}
700+
}
701+
702+
return result;
703+
}
704+
705+
/// <summary>
706+
/// 合并请求头数据
707+
/// </summary>
708+
/// <param name="header">本次请求的请求头数据</param>
709+
/// <returns>合并后的请求头数据</returns>
710+
private Dictionary<string, string> MergeHeader(Dictionary<string, string> header)
711+
{
712+
if (m_BaseHeader.Count == 0)
713+
{
714+
return header;
715+
}
716+
717+
var result = new Dictionary<string, string>(m_BaseHeader);
718+
if (header != null)
719+
{
720+
foreach (var kv in header)
721+
{
722+
result[kv.Key] = kv.Value;
723+
}
724+
}
725+
726+
return result;
727+
}
728+
729+
/// <summary>
730+
/// 合并查询参数数据
731+
/// </summary>
732+
/// <param name="queryString">本次请求的查询参数数据</param>
733+
/// <returns>合并后的查询参数数据</returns>
734+
private Dictionary<string, string> MergeQueryString(Dictionary<string, string> queryString)
735+
{
736+
if (m_BaseQueryString.Count == 0)
737+
{
738+
return queryString;
739+
}
740+
741+
var result = new Dictionary<string, string>(m_BaseQueryString);
742+
if (queryString != null)
743+
{
744+
foreach (var kv in queryString)
745+
{
746+
result[kv.Key] = kv.Value;
747+
}
748+
}
749+
750+
return result;
751+
}
752+
753+
#endregion
754+
568755
/// <summary>
569756
/// URL 标准化
570757
/// </summary>

0 commit comments

Comments
 (0)