Skip to content

Commit c5f2421

Browse files
committed
Merge branch 'master' of https://github.com/dotnetcore/WebApiClient into master
2 parents 4b37715 + 8e48ae5 commit c5f2421

File tree

1 file changed

+53
-6
lines changed

1 file changed

+53
-6
lines changed

README.md

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,14 @@ public class User
139139
内置特性指框架内提供的一些特性,拿来即用就能满足一般情况下的各种应用。当然,开发者也可以在实际应用中,编写满足特定场景需求的特性,然后将自定义特性修饰到接口、方法或参数即可。
140140

141141
#### Return特性
142-
143142
特性名称 | 功能描述 | 备注
144143
---|---|---|
145144
RawReturnAttribute | 处理原始类型返回值 | 缺省也生效
146145
JsonReturnAttribute | 处理Json模型返回值 | 缺省也生效
147146
XmlReturnAttribute | 处理Xml模型返回值 | 缺省也生效
147+
NoneReturnAttribute | 处理空返回值 | 缺省也生效
148148

149149
#### 常用Action特性
150-
151150
特性名称 | 功能描述 | 备注
152151
---|---|---|
153152
HttpHostAttribute | 请求服务http绝对完整主机域名| 优先级比Options配置低
@@ -161,7 +160,6 @@ HttpDeleteAttribute | 声明Delete请求方法与路径| 支持null、绝对或
161160
*FormDataTextAttribute* | 声明FormData表单字段与值 | 常量键和值
162161

163162
#### 常用Parameter特性
164-
165163
特性名称 | 功能描述 | 备注
166164
---|---|---|
167165
PathQueryAttribute | 参数值的键值对作为url路径参数或query参数的特性 | 缺省特性的参数默认为该特性
@@ -177,14 +175,12 @@ ParameterAttribute | 聚合性的请求参数声明 | 不支持细颗粒配置
177175
*FormDataTextAttribute* | 参数值作为FormData表单字段与值 | 只支持简单类型参数
178176

179177
#### Filter特性
180-
181178
特性名称 | 功能描述| 备注
182179
---|---|---|
183180
ApiFilterAttribute | Filter特性抽象类 |
184181
LoggingFilterAttribute | 请求和响应内容的输出为日志的过滤器 |
185182

186183
#### 自解释参数类型
187-
188184
类型名称 | 功能描述 | 备注
189185
---|---|---|
190186
FormDataFile | 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
11701217
Content-Type: application/json-rpc
11711218
11721219
{"jsonrpc":"2.0","method":"add","params":["laojiu",18],"id":1}
1173-
```
1220+
```

0 commit comments

Comments
 (0)