@@ -139,15 +139,14 @@ public class User
139139内置特性指框架内提供的一些特性,拿来即用就能满足一般情况下的各种应用。当然,开发者也可以在实际应用中,编写满足特定场景需求的特性,然后将自定义特性修饰到接口、方法或参数即可。
140140
141141#### Return特性
142-
143142特性名称 | 功能描述 | 备注
144143---|---|---|
145144RawReturnAttribute | 处理原始类型返回值 | 缺省也生效
146145JsonReturnAttribute | 处理Json模型返回值 | 缺省也生效
147146XmlReturnAttribute | 处理Xml模型返回值 | 缺省也生效
147+ NoneReturnAttribute | 处理空返回值 | 缺省也生效
148148
149149#### 常用Action特性
150-
151150特性名称 | 功能描述 | 备注
152151---|---|---|
153152HttpHostAttribute | 请求服务http绝对完整主机域名| 优先级比Options配置低
@@ -161,7 +160,6 @@ HttpDeleteAttribute | 声明Delete请求方法与路径| 支持null、绝对或
161160* FormDataTextAttribute* | 声明FormData表单字段与值 | 常量键和值
162161
163162#### 常用Parameter特性
164-
165163特性名称 | 功能描述 | 备注
166164---|---|---|
167165PathQueryAttribute | 参数值的键值对作为url路径参数或query参数的特性 | 缺省特性的参数默认为该特性
@@ -177,14 +175,12 @@ ParameterAttribute | 聚合性的请求参数声明 | 不支持细颗粒配置
177175* FormDataTextAttribute* | 参数值作为FormData表单字段与值 | 只支持简单类型参数
178176
179177#### Filter特性
180-
181178特性名称 | 功能描述| 备注
182179---|---|---|
183180ApiFilterAttribute | Filter特性抽象类 |
184181LoggingFilterAttribute | 请求和响应内容的输出为日志的过滤器 |
185182
186183#### 自解释参数类型
187-
188184类型名称 | 功能描述 | 备注
189185---|---|---|
190186FormDataFile | form-data的一个文件项 | 无需特性修饰,等效于FileInfo类型
@@ -924,6 +920,57 @@ services
924920 });
925921```
926922
923+ #### Cookie过期自动刷新
924+ 对于使用Cookie机制的接口,只有在接口请求之后,才知道Cookie是否已失效。通过自定义CookieAuthorizationHandler,可以做在请求某个接口过程中,遇到Cookie失效时自动刷新Cookie再重试请求接口。
925+
926+ 首先,我们需要把登录接口与某它业务接口拆分在不同的接口定义,例如IUserApi和IUserLoginApi
927+ ```
928+ [HttpHost("http://localhost:5000/")]
929+ public interface IUserLoginApi
930+ {
931+ [HttpPost("/users")]
932+ Task<HttpResponseMessage> LoginAsync([JsonContent] Account account);
933+ }
934+ ```
935+
936+ 然后实现自动登录的CookieAuthorizationHandler
937+ ```
938+ public class AutoRefreshCookieHandler : CookieAuthorizationHandler
939+ {
940+ private readonly IUserLoginApi api;
941+
942+ public AutoRefreshCookieHandler(IUserLoginApi api)
943+ {
944+ this.api = api;
945+ }
946+
947+ /// <summary>
948+ /// 登录并刷新Cookie
949+ /// </summary>
950+ /// <returns>返回登录响应消息</returns>
951+ protected override Task<HttpResponseMessage> RefreshCookieAsync()
952+ {
953+ return this.api.LoginAsync(new Account
954+ {
955+ account = "admin",
956+ password = "123456"
957+ });
958+ }
959+ }
960+ ```
961+
962+ 最后,注册IUserApi、IUserLoginApi,并为IUserApi配置AutoRefreshCookieHandler
963+ ```
964+ services
965+ .AddHttpApi<IUserLoginApi>();
966+
967+ services
968+ .AddHttpApi<IUserApi>()
969+ .AddHttpMessageHandler(s => new AutoRefreshCookieHandler(s.GetService<IUserLoginApi>()));
970+ ```
971+
972+ 现在,调用IUserApi的任意接口,只要响应的状态码为401,就触发IUserLoginApi登录,然后将登录得到的cookie来重试请求接口,最终响应为正确的结果。你也可以重写CookieAuthorizationHandler的IsUnauthorizedAsync(HttpResponseMessage)方法来指示响应是未授权状态。
973+
927974### OAuths&Token
928975使用WebApiClientCore.Extensions.OAuths扩展,轻松支持token的获取、刷新与应用。
929976
@@ -1170,4 +1217,4 @@ Accept: application/json; q=0.01, application/xml; q=0.01
11701217Content-Type: application/json-rpc
11711218
11721219{"jsonrpc":"2.0","method":"add","params":["laojiu",18],"id":1}
1173- ```
1220+ ```
0 commit comments