@@ -139,15 +139,14 @@ public class User
139
139
内置特性指框架内提供的一些特性,拿来即用就能满足一般情况下的各种应用。当然,开发者也可以在实际应用中,编写满足特定场景需求的特性,然后将自定义特性修饰到接口、方法或参数即可。
140
140
141
141
#### Return特性
142
-
143
142
特性名称 | 功能描述 | 备注
144
143
---|---|---|
145
144
RawReturnAttribute | 处理原始类型返回值 | 缺省也生效
146
145
JsonReturnAttribute | 处理Json模型返回值 | 缺省也生效
147
146
XmlReturnAttribute | 处理Xml模型返回值 | 缺省也生效
147
+ NoneReturnAttribute | 处理空返回值 | 缺省也生效
148
148
149
149
#### 常用Action特性
150
-
151
150
特性名称 | 功能描述 | 备注
152
151
---|---|---|
153
152
HttpHostAttribute | 请求服务http绝对完整主机域名| 优先级比Options配置低
@@ -161,7 +160,6 @@ HttpDeleteAttribute | 声明Delete请求方法与路径| 支持null、绝对或
161
160
* FormDataTextAttribute* | 声明FormData表单字段与值 | 常量键和值
162
161
163
162
#### 常用Parameter特性
164
-
165
163
特性名称 | 功能描述 | 备注
166
164
---|---|---|
167
165
PathQueryAttribute | 参数值的键值对作为url路径参数或query参数的特性 | 缺省特性的参数默认为该特性
@@ -177,14 +175,12 @@ ParameterAttribute | 聚合性的请求参数声明 | 不支持细颗粒配置
177
175
* FormDataTextAttribute* | 参数值作为FormData表单字段与值 | 只支持简单类型参数
178
176
179
177
#### Filter特性
180
-
181
178
特性名称 | 功能描述| 备注
182
179
---|---|---|
183
180
ApiFilterAttribute | Filter特性抽象类 |
184
181
LoggingFilterAttribute | 请求和响应内容的输出为日志的过滤器 |
185
182
186
183
#### 自解释参数类型
187
-
188
184
类型名称 | 功能描述 | 备注
189
185
---|---|---|
190
186
FormDataFile | form-data的一个文件项 | 无需特性修饰,等效于FileInfo类型
@@ -924,6 +920,57 @@ services
924
920
});
925
921
```
926
922
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
+
927
974
### OAuths&Token
928
975
使用WebApiClientCore.Extensions.OAuths扩展,轻松支持token的获取、刷新与应用。
929
976
@@ -1170,4 +1217,4 @@ Accept: application/json; q=0.01, application/xml; q=0.01
1170
1217
Content-Type: application/json-rpc
1171
1218
1172
1219
{"jsonrpc":"2.0","method":"add","params":["laojiu",18],"id":1}
1173
- ```
1220
+ ```
0 commit comments