Skip to content

Commit 24cf3b2

Browse files
committed
PathQuery增加CollectionFormat属性
1 parent 1b04ae0 commit 24cf3b2

File tree

2 files changed

+90
-4
lines changed

2 files changed

+90
-4
lines changed

WebApiClient/Attributes/ParameterAttributes/PathQueryAttribute.cs

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Text;
45
using System.Threading.Tasks;
56
using WebApiClient.Contexts;
@@ -45,6 +46,11 @@ public string Encoding
4546
/// </summary>
4647
public string DateTimeFormat { get; set; }
4748

49+
/// <summary>
50+
/// 获取或设置集合格式化方式
51+
/// </summary>
52+
public CollectionFormat CollectionFormat = CollectionFormat.Multi;
53+
4854
/// <summary>
4955
/// 表示Url路径参数或query参数的特性
5056
/// </summary>
@@ -84,21 +90,64 @@ public async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescr
8490

8591
var options = context.HttpApiConfig.FormatOptions.CloneChange(this.DateTimeFormat);
8692
var keyValues = context.HttpApiConfig.KeyValueFormatter.Serialize(parameter, options);
93+
var query = this.FormateCollection(keyValues);
8794

88-
context.RequestMessage.RequestUri = this.UsePathQuery(uri, keyValues);
95+
context.RequestMessage.RequestUri = this.UsePathQuery(uri, query);
8996
await ApiTask.CompletedTask;
9097
}
9198

99+
/// <summary>
100+
/// 格式化集合
101+
/// </summary>
102+
/// <param name="keyValues">键值对</param>
103+
/// <returns></returns>
104+
private IEnumerable<KeyValuePair<string, string>> FormateCollection(IEnumerable<KeyValuePair<string, string>> keyValues)
105+
{
106+
IEnumerable<KeyValuePair<string, string>> JoinValue(IEnumerable<IGrouping<string, KeyValuePair<string, string>>> grouping, string separator)
107+
{
108+
return grouping.Select(item =>
109+
{
110+
var value = string.Join(separator, item.Select(i => i.Value));
111+
return new KeyValuePair<string, string>(item.Key, value);
112+
});
113+
}
114+
115+
if (this.CollectionFormat == CollectionFormat.Multi)
116+
{
117+
return keyValues;
118+
}
119+
120+
var groups = keyValues.GroupBy(item => item.Key);
121+
switch (this.CollectionFormat)
122+
{
123+
case CollectionFormat.Csv:
124+
return JoinValue(groups, @",");
125+
126+
case CollectionFormat.Ssv:
127+
return JoinValue(groups, @" ");
128+
129+
case CollectionFormat.Tsv:
130+
return JoinValue(groups, @"\");
131+
132+
case CollectionFormat.Pipes:
133+
return JoinValue(groups, @"|");
134+
135+
default:
136+
throw new NotImplementedException();
137+
}
138+
}
139+
140+
92141
/// <summary>
93142
/// url添加query或替换segment
94143
/// </summary>
95144
/// <param name="uri">url</param>
96-
/// <param name="keyValues">键值对</param>
145+
/// <param name="query">键值对</param>
97146
/// <returns></returns>
98-
protected Uri UsePathQuery(Uri uri, IEnumerable<KeyValuePair<string, string>> keyValues)
147+
protected Uri UsePathQuery(Uri uri, IEnumerable<KeyValuePair<string, string>> query)
99148
{
100149
var editor = new UriEditor(uri, this.encoding);
101-
foreach (var keyValue in keyValues)
150+
foreach (var keyValue in query)
102151
{
103152
if (editor.Replace(keyValue.Key, keyValue.Value) == false)
104153
{

WebApiClient/CollectionFormat.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
namespace WebApiClient
2+
{
3+
/// <summary>
4+
/// 集合格式化方式
5+
/// </summary>
6+
public enum CollectionFormat
7+
{
8+
/// <summary>
9+
/// 逗号分隔
10+
/// value1,value2
11+
/// </summary>
12+
Csv,
13+
14+
/// <summary>
15+
/// 空格分隔
16+
/// value1 value2
17+
/// </summary>
18+
Ssv,
19+
20+
/// <summary>
21+
/// 反斜杠分隔
22+
/// value1\value2
23+
/// </summary>
24+
Tsv,
25+
26+
/// <summary>
27+
/// 竖线分隔
28+
/// value1|value2
29+
/// </summary>
30+
Pipes,
31+
32+
/// <summary>
33+
/// 单属性可以取多个值
34+
/// </summary>
35+
Multi
36+
}
37+
}

0 commit comments

Comments
 (0)