Skip to content

Commit d0efa87

Browse files
committed
增加FileInfo做为文件上传参数;
增加JsonString`1类型
1 parent 83409d2 commit d0efa87

File tree

10 files changed

+193
-5
lines changed

10 files changed

+193
-5
lines changed

WebApiClient/Attributes/ParameterAttributes/BsonContentAttribute.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using WebApiClient.Contexts;
66
using WebApiClient.DataAnnotations;
7+
using WebApiClient.Defaults;
78

89
namespace WebApiClient.Attributes
910
{
@@ -53,7 +54,9 @@ protected sealed override void SetHttpContent(ApiActionContext context, ApiParam
5354
/// <returns></returns>
5455
protected virtual JsonSerializerSettings CreateSerializerSettings(FormatOptions options)
5556
{
56-
return options.ToSerializerSettings(FormatScope.BsonFormat);
57+
var setting= options.ToSerializerSettings(FormatScope.BsonFormat);
58+
setting.Converters.Add(JsonStringConverter.Instance);
59+
return setting;
5760
}
5861
}
5962
}

WebApiClient/Attributes/ParameterAttributes/XmlContentAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace WebApiClient.Attributes
66
{
77
/// <summary>
8-
/// 使用JsonFormatter序列化参数值得到的xml文本作为application/xml请求
8+
/// 使用XmlFormatter序列化参数值得到的xml文本作为application/xml请求
99
/// </summary>
1010
public class XmlContentAttribute : HttpContentAttribute, IEncodingable
1111
{

WebApiClient/Attributes/ReturnAttributes/BsonReturnAttribute.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using WebApiClient.Contexts;
66
using WebApiClient.DataAnnotations;
7+
using WebApiClient.Defaults;
78

89
namespace WebApiClient.Attributes
910
{
@@ -47,7 +48,9 @@ protected override async Task<object> GetTaskResult(ApiActionContext context)
4748
/// <returns></returns>
4849
protected virtual JsonSerializerSettings CreateSerializerSettings(FormatOptions options)
4950
{
50-
return options.ToSerializerSettings(FormatScope.BsonFormat);
51+
var setting = options.ToSerializerSettings(FormatScope.BsonFormat);
52+
setting.Converters.Add(JsonStringConverter.Instance);
53+
return setting;
5154
}
5255
}
5356
}

WebApiClient/Contexts/ApiParameterDescriptor.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.ComponentModel.DataAnnotations;
44
using System.Diagnostics;
5+
using System.IO;
56
using System.Linq;
67
using System.Net.Http;
78
using System.Reflection;
@@ -144,6 +145,11 @@ protected virtual IEnumerable<IApiParameterAttribute> GetAttributes(Type paramet
144145
return RepeatOne<CancellationTokenAttribute>();
145146
}
146147

148+
if (parameterType == typeof(FileInfo))
149+
{
150+
return RepeatOne<FileInfoAttribute>();
151+
}
152+
147153
if (defined.Any() == true)
148154
{
149155
return defined;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Reflection;
6+
using System.Text;
7+
8+
namespace WebApiClient.Defaults
9+
{
10+
/// <summary>
11+
/// 定义JsonString的接口
12+
/// </summary>
13+
interface IJsonString
14+
{
15+
/// <summary>
16+
/// 获取值
17+
/// </summary>
18+
object Value { get; }
19+
}
20+
21+
/// <summary>
22+
/// JsonString的类型转换器
23+
/// </summary>
24+
class JsonStringConverter : JsonConverter
25+
{
26+
/// <summary>
27+
/// 获取唯一实例
28+
/// </summary>
29+
public static JsonStringConverter Instance { get; } = new JsonStringConverter();
30+
31+
/// <summary>
32+
/// 是不支持转换
33+
/// </summary>
34+
/// <param name="objectType"></param>
35+
/// <returns></returns>
36+
public override bool CanConvert(Type objectType)
37+
{
38+
return objectType.IsInheritFrom<IJsonString>();
39+
}
40+
41+
/// <summary>
42+
/// 将json文本序列化JsonString的Value的类型
43+
/// 并构建JsonString类型并返回
44+
/// </summary>
45+
/// <param name="reader"></param>
46+
/// <param name="objectType"></param>
47+
/// <param name="existingValue"></param>
48+
/// <param name="serializer"></param>
49+
/// <returns></returns>
50+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
51+
{
52+
var stringReader = new StringReader(reader.Value?.ToString());
53+
using (var jsonReader = new JsonTextReader(stringReader))
54+
{
55+
var valueType = objectType.GetTypeInfo().GenericTypeArguments.First();
56+
var value = serializer.Deserialize(jsonReader, valueType);
57+
var jsonValue = Activator.CreateInstance(objectType, value);
58+
return jsonValue;
59+
}
60+
}
61+
62+
63+
/// <summary>
64+
/// 将JsonString的value序列化文本,并作为json的某字段值
65+
/// </summary>
66+
/// <param name="writer"></param>
67+
/// <param name="value"></param>
68+
/// <param name="serializer"></param>
69+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
70+
{
71+
var builder = new StringBuilder();
72+
using (var jsonWriter = new JsonTextWriter(new StringWriter(builder)))
73+
{
74+
serializer.Serialize(jsonWriter, ((IJsonString)value).Value);
75+
var jsonText = builder.ToString();
76+
writer.WriteValue(jsonText);
77+
}
78+
}
79+
}
80+
}

WebApiClient/Defaults/JsonFormatter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ public object Deserialize(string json, Type objType)
6262
/// <returns></returns>
6363
protected virtual JsonSerializerSettings CreateSerializerSettings(FormatOptions options)
6464
{
65-
return options.ToSerializerSettings(FormatScope.JsonFormat);
65+
var setting = options.ToSerializerSettings(FormatScope.JsonFormat);
66+
setting.Converters.Add(JsonStringConverter.Instance);
67+
return setting;
6668
}
6769
}
6870
}

WebApiClient/Defaults/KeyValueFormatter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ protected virtual JsonSerializerSettings CreateSerializerSettings(FormatOptions
7070
{
7171
var useCamelCase = options?.UseCamelCase == true;
7272
var setting = options.ToSerializerSettings(FormatScope.KeyValueFormat);
73+
74+
setting.Converters.Add(JsonStringConverter.Instance);
7375
setting.Converters.Add(new KeyValuePairConverter(useCamelCase));
7476
return setting;
7577
}

WebApiClient/Internal/Attributes/CancellationTokenAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace WebApiClient
77
{
88
/// <summary>
9-
/// 表示参数内容为IApiParameterable对象或其数组
9+
/// 表示参数内容为CancellationToken处理特性
1010
/// </summary>
1111
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
1212
class CancellationTokenAttribute : Attribute, IApiParameterAttribute
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.IO;
3+
using System.Text;
4+
using System.Threading.Tasks;
5+
using WebApiClient.Contexts;
6+
7+
namespace WebApiClient
8+
{
9+
/// <summary>
10+
/// 表示参数内容为FileInfo处理特性
11+
/// </summary>
12+
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
13+
class FileInfoAttribute : Attribute, IApiParameterAttribute
14+
{
15+
/// <summary>
16+
/// http请求之前
17+
/// </summary>
18+
/// <param name="context">上下文</param>
19+
/// <param name="parameter">特性关联的参数</param>
20+
/// <returns></returns>
21+
public Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter)
22+
{
23+
var fileInfo = parameter.Value as FileInfo;
24+
if (fileInfo != null)
25+
{
26+
var stream = fileInfo.Open(FileMode.Open, FileAccess.Read);
27+
var fileName = Path.GetFileName(fileInfo.FullName);
28+
var encodedFileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
29+
context.RequestMessage.AddMulitpartFile(stream, parameter.Name, encodedFileName, null);
30+
}
31+
return ApiTask.CompletedTask;
32+
}
33+
}
34+
}

WebApiClient/JsonString.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using WebApiClient.Defaults;
2+
3+
namespace WebApiClient
4+
{
5+
/// <summary>
6+
/// 表示Json字符串
7+
/// 该字符串为Value对象的json文本
8+
/// </summary>
9+
/// <typeparam name="T"></typeparam>
10+
public sealed class JsonString<T> : IJsonString
11+
{
12+
/// <summary>
13+
/// 获取类型值
14+
/// </summary>
15+
public T Value { get; }
16+
17+
/// <summary>
18+
/// 获取类型值
19+
/// </summary>
20+
object IJsonString.Value
21+
{
22+
get => this.Value;
23+
}
24+
25+
/// <summary>
26+
/// Json字符串
27+
/// </summary>
28+
/// <param name="value">字符串对应的类型值</param>
29+
public JsonString(T value)
30+
{
31+
this.Value = value;
32+
}
33+
34+
/// <summary>
35+
/// T类型隐式转换
36+
/// </summary>
37+
/// <param name="value"></param>
38+
/// <returns></returns>
39+
public static implicit operator JsonString<T>(T value)
40+
{
41+
return new JsonString<T>(value);
42+
}
43+
44+
/// <summary>
45+
/// 类型隐式转换为T
46+
/// </summary>
47+
/// <param name="value"></param>
48+
/// <returns></returns>
49+
public static implicit operator T(JsonString<T> value)
50+
{
51+
if (value == null)
52+
{
53+
return default(T);
54+
}
55+
return value.Value;
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)