Skip to content

Commit 7fccc61

Browse files
committed
增加HeadersAttribute特性
1 parent 0457468 commit 7fccc61

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using WebApiClient.Contexts;
4+
using WebApiClient.Interfaces;
5+
6+
namespace WebApiClient.Attributes
7+
{
8+
/// <summary>
9+
/// 表示参数值作为请求头
10+
/// 对于复杂类型的参数值,将拆解作为多个Header
11+
/// </summary>
12+
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
13+
public class HeadersAttribute : Attribute, IApiParameterAttribute
14+
{
15+
/// <summary>
16+
/// http请求之前
17+
/// </summary>
18+
/// <param name="context">上下文</param>
19+
/// <param name="parameter">特性关联的参数</param>
20+
/// <exception cref="HttpApiConfigException"></exception>
21+
/// <returns></returns>
22+
public async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter)
23+
{
24+
var options = context.HttpApiConfig.FormatOptions;
25+
var formatter = context.HttpApiConfig.KeyValueFormatter;
26+
var keyValues = formatter.Serialize(parameter, options);
27+
28+
foreach (var kv in keyValues)
29+
{
30+
var name = kv.Key.Replace("_", "-");
31+
var header = new HeaderAttribute(name, kv.Value);
32+
await header.BeforeRequestAsync(context);
33+
}
34+
}
35+
}
36+
}

WebApiClient/HttpApiRequestMessage.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public async Task AddFormFieldAsync(IEnumerable<KeyValuePair<string, string>> ke
158158
{
159159
this.EnsureMediaTypeEqual(mediaType);
160160
formBody = await this.Content.ReadAsByteArrayAsync();
161+
this.Content.Dispose();
161162
}
162163

163164
var bytesContent = MergeFields(formBody, keyValues);
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Net.Http;
5+
using System.Threading.Tasks;
6+
using WebApiClient;
7+
using WebApiClient.Attributes;
8+
using WebApiClient.Contexts;
9+
using Xunit;
10+
11+
12+
namespace WebApiClientTest.Attributes.ParameterAttributes
13+
{
14+
public class HeadersAttributeTest
15+
{
16+
public interface IMyApi : IDisposable
17+
{
18+
ITask<HttpResponseMessage> PostAsync(object headers);
19+
}
20+
21+
[Fact]
22+
public async Task IApiParameterAttributeTest()
23+
{
24+
var context = new ApiActionContext
25+
{
26+
HttpApiConfig = new HttpApiConfig(),
27+
RequestMessage = new HttpApiRequestMessage
28+
{
29+
RequestUri = new Uri("http://www.mywebapi.com"),
30+
Method = HttpMethod.Post
31+
},
32+
ApiActionDescriptor = ApiDescriptorCache.GetApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync"))
33+
};
34+
35+
var parameter = context.ApiActionDescriptor.Parameters[0];
36+
parameter.Value = new { @class = 123, User_Agent = "WebApiClient" };
37+
38+
var attr = new HeadersAttribute();
39+
await attr.BeforeRequestAsync(context, parameter);
40+
41+
context.RequestMessage.Headers.TryGetValues("User-Agent", out IEnumerable<string> values);
42+
Assert.Equal("WebApiClient", values.FirstOrDefault());
43+
44+
context.RequestMessage.Headers.TryGetValues("class", out IEnumerable<string> cValues);
45+
Assert.Equal("123", cValues.FirstOrDefault());
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)