|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
| 3 | +using System.Linq; |
3 | 4 | using System.Text; |
4 | 5 | using System.Threading.Tasks; |
5 | 6 | using WebApiClient.Contexts; |
@@ -45,6 +46,11 @@ public string Encoding |
45 | 46 | /// </summary> |
46 | 47 | public string DateTimeFormat { get; set; } |
47 | 48 |
|
| 49 | + /// <summary> |
| 50 | + /// 获取或设置集合格式化方式 |
| 51 | + /// </summary> |
| 52 | + public CollectionFormat CollectionFormat = CollectionFormat.Multi; |
| 53 | + |
48 | 54 | /// <summary> |
49 | 55 | /// 表示Url路径参数或query参数的特性 |
50 | 56 | /// </summary> |
@@ -84,21 +90,64 @@ public async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescr |
84 | 90 |
|
85 | 91 | var options = context.HttpApiConfig.FormatOptions.CloneChange(this.DateTimeFormat); |
86 | 92 | var keyValues = context.HttpApiConfig.KeyValueFormatter.Serialize(parameter, options); |
| 93 | + var query = this.FormateCollection(keyValues); |
87 | 94 |
|
88 | | - context.RequestMessage.RequestUri = this.UsePathQuery(uri, keyValues); |
| 95 | + context.RequestMessage.RequestUri = this.UsePathQuery(uri, query); |
89 | 96 | await ApiTask.CompletedTask; |
90 | 97 | } |
91 | 98 |
|
| 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 | + |
92 | 141 | /// <summary> |
93 | 142 | /// url添加query或替换segment |
94 | 143 | /// </summary> |
95 | 144 | /// <param name="uri">url</param> |
96 | | - /// <param name="keyValues">键值对</param> |
| 145 | + /// <param name="query">键值对</param> |
97 | 146 | /// <returns></returns> |
98 | | - protected Uri UsePathQuery(Uri uri, IEnumerable<KeyValuePair<string, string>> keyValues) |
| 147 | + protected Uri UsePathQuery(Uri uri, IEnumerable<KeyValuePair<string, string>> query) |
99 | 148 | { |
100 | 149 | var editor = new UriEditor(uri, this.encoding); |
101 | | - foreach (var keyValue in keyValues) |
| 150 | + foreach (var keyValue in query) |
102 | 151 | { |
103 | 152 | if (editor.Replace(keyValue.Key, keyValue.Value) == false) |
104 | 153 | { |
|
0 commit comments