Skip to content

Commit 0bd77b0

Browse files
committed
先验证ContentType是否匹配,再执行其它逻辑;
增加可重写的ValidateResponseAsync方法; 增加可重写的ValidateResponseStatusCode方法;
1 parent 0d48324 commit 0bd77b0

File tree

2 files changed

+43
-39
lines changed

2 files changed

+43
-39
lines changed

WebApiClientCore/Attributes/ReturnAttributes/ApiReturnAttribute.cs

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Net;
3+
using System.Net.Http;
34
using System.Net.Http.Headers;
45
using System.Threading.Tasks;
56
using WebApiClientCore.Exceptions;
@@ -83,73 +84,75 @@ public Task OnRequestAsync(ApiRequestContext context)
8384
/// <returns></returns>
8485
public async Task OnResponseAsync(ApiResponseContext context)
8586
{
86-
this.UseSuccessStatusCode(context);
87-
if (this.UseMatchAcceptContentType(context) == true)
87+
if (this.EnsureMatchAcceptContentType == true)
8888
{
89-
await this.SetResultAsync(context).ConfigureAwait(false);
89+
var response = context.HttpContext.ResponseMessage;
90+
var responseContenType = response?.Content.Headers.ContentType;
91+
if (this.IsMatchAcceptContentType(responseContenType) == false)
92+
{
93+
return;
94+
}
9095
}
96+
97+
await this.ValidateResponseAsync(context).ConfigureAwait(false);
98+
await this.SetResultAsync(context).ConfigureAwait(false);
9199
}
92100

93101
/// <summary>
94-
/// 应用成功状态码
102+
/// 指示响应的ContentType与Accept-ContentType是否匹配
103+
/// 返回false则调用下一个ApiReturnAttribute来处理响应结果
95104
/// </summary>
96-
/// <param name="context"></param>
105+
/// <param name="responseContentType">响应的ContentType</param>
106+
/// <returns></returns>
107+
protected virtual bool IsMatchAcceptContentType(MediaTypeHeaderValue? responseContentType)
108+
{
109+
var accept = this.AcceptContentType?.MediaType;
110+
var response = responseContentType?.MediaType;
111+
return string.Equals(accept, response, StringComparison.OrdinalIgnoreCase);
112+
}
113+
114+
/// <summary>
115+
/// 验证响应消息
116+
/// 验证不通过则抛出指定的异常
117+
/// </summary>
118+
/// <param name="context">上下文</param>
97119
/// <exception cref="ApiResponseStatusException"></exception>
98-
private void UseSuccessStatusCode(ApiResponseContext context)
120+
/// <returns></returns>
121+
protected virtual Task ValidateResponseAsync(ApiResponseContext context)
99122
{
100123
var response = context.HttpContext.ResponseMessage;
101-
if (response == null || this.EnsureSuccessStatusCode == false)
124+
if (response != null && this.EnsureSuccessStatusCode == true)
102125
{
103-
return;
104-
}
105-
106-
if (this.IsSuccessStatusCode(response.StatusCode) == false)
107-
{
108-
throw new ApiResponseStatusException(response);
126+
this.ValidateResponseStatusCode(response);
109127
}
128+
return Task.CompletedTask;
110129
}
111130

112131
/// <summary>
113-
/// 应用匹配ContentType
132+
/// 验证响应消息的http状态码
133+
/// 验证不通过则抛出指定的异常
114134
/// </summary>
115-
/// <param name="context"></param>
116-
/// <returns></returns>
117-
private bool UseMatchAcceptContentType(ApiResponseContext context)
135+
/// <param name="response">响应消息</param>
136+
/// <exception cref="ApiResponseStatusException"></exception>
137+
protected virtual void ValidateResponseStatusCode(HttpResponseMessage response)
118138
{
119-
if (this.EnsureMatchAcceptContentType == true && this.AcceptContentType != null)
139+
if (this.IsSuccessStatusCode(response.StatusCode) == false)
120140
{
121-
var contenType = context.HttpContext.ResponseMessage?.Content.Headers.ContentType;
122-
if (this.IsMatchAcceptContentType(contenType) == false)
123-
{
124-
return false;
125-
}
141+
throw new ApiResponseStatusException(response);
126142
}
127-
return true;
128143
}
129144

130145
/// <summary>
131-
/// 指示状态码是否为成功的状态码
146+
/// 指示http状态码是否为成功的状态码
132147
/// </summary>
133-
/// <param name="statusCode">状态码</param>
148+
/// <param name="statusCode">http状态码</param>
134149
/// <returns></returns>
135150
protected virtual bool IsSuccessStatusCode(HttpStatusCode statusCode)
136151
{
137152
var status = (int)statusCode;
138153
return status >= 200 && status <= 299;
139154
}
140155

141-
/// <summary>
142-
/// 验证响应的ContentType与Accept-ContentType是否匹配
143-
/// </summary>
144-
/// <param name="responseContentType"></param>
145-
/// <returns></returns>
146-
protected virtual bool IsMatchAcceptContentType(MediaTypeHeaderValue? responseContentType)
147-
{
148-
var accept = this.AcceptContentType?.MediaType;
149-
var response = responseContentType?.MediaType;
150-
return string.Equals(accept, response, StringComparison.OrdinalIgnoreCase);
151-
}
152-
153156
/// <summary>
154157
/// 设置结果值
155158
/// </summary>

WebApiClientCore/Attributes/ReturnAttributes/RawReturnAttribute.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public RawReturnAttribute(double acceptQuality)
3939
}
4040

4141
/// <summary>
42-
/// 验证响应的ContentType与Accept-ContentType是否匹配
42+
/// 指示响应的ContentType与Accept-ContentType是否匹配
43+
/// 返回false则调用下一个ApiReturnAttribute来处理响应结果
4344
/// </summary>
4445
/// <param name="responseContentType"></param>
4546
/// <returns></returns>

0 commit comments

Comments
 (0)