WebApiClient 实例
一、引用类库
<PackageReference Include="WebApiClientCore" Version="2.1.5" />
<PackageReference Include="WebApiClientCore.Extensions.NewtonsoftJson" Version="2.1.5" />
<PackageReference Include="WebApiClientCore.Extensions.OAuths" Version="2.1.5" />
二、定义接口
[XAccessToken]
[JsonNetReturn]
public interface IOssApi
{
[HttpPost("/oss/oss/getAuth")]
Task<ResponseResult<string[]>> GetAuthAsync([JsonNetContent] string[] path);
}
- XAccessToken - 自定义特性,用于在请求时带上token值;
- JsonNetReturn - Json.NET扩展特性,使用时需要引用
WebApiClientCore.Extensions.NewtonsoftJson
扩展; - ResponseResult - 自定义接口返回类型。
public record ResponseResult<T>
{
[JsonProperty("code")]
public long Code { get; set; }
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("data")]
public required T Data { get; set; }
[JsonProperty("message")]
public string? Message { get; set; }
}
三、注册和配置接口
services.AddHttpApi<IOssApi>()
.ConfigureHttpApi(o =>
{
# 配置 HttpHost
o.HttpHost = new Uri("https://<链接>");
})
.ConfigureNewtonsoftJson(o =>
{
# 配置 Json 序列化选项
o.JsonSerializeOptions.NullValueHandling = NullValueHandling.Ignore;
});
# 注册自定义Token实现
services.AddTokenProvider<IOssApi, CustomTokenProvider>();
# 注册Token获取服务
services.AddTransient<ITokenService, TokenServiceProvider>();
四、自定义Token实现
注意:以下内容的具体实现因项目而异。
CustomTokenProvider
public class CustomTokenProvider : TokenProvider
{
public CustomTokenProvider(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
protected override Task<TokenResult?> RequestTokenAsync(IServiceProvider serviceProvider)
{
return serviceProvider.GetRequiredService<ITokenService>().RequestTokenAsync("id", "secret");
}
protected override Task<TokenResult?> RefreshTokenAsync(IServiceProvider serviceProvider, string refresh_token)
{
return this.RequestTokenAsync(serviceProvider);
}
}
TokenServiceProvider
public class TokenServiceProvider : ITokenService
{
public async Task<TokenResult?> RequestTokenAsync(string clientId, string clientSecret)
{
// for test
await Task.CompletedTask;
return new TokenResult
{
Id_token = Guid.NewGuid().ToString().ToLower(),
Access_token = "<请求时使用的Token值>",
Refresh_token = "<刷新Token时使用的Token值>",
Expires_in = 7200, // 过期秒数,7200 即 Token值在2个小时后过期
Token_type = "X-Access-Token"
}; ;
}
}
XAccessTokenAttribute
public class XAccessTokenAttribute : OAuthTokenAttribute
{
protected override void UseTokenResult(ApiRequestContext context, TokenResult tokenResult)
{
// 修改用户代理
context.HttpContext.RequestMessage.Headers.UserAgent.Clear();
context.HttpContext.RequestMessage.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36");
// 增加Token
context.HttpContext.RequestMessage.Headers.Add("X-Access-Token", tokenResult.Access_token);
}
}
请求流程及调用关系
注意:此图仅凭感觉绘制,用于方便理解调用顺序。不纠结对错及细节问题。
官方文档: webapiclient.github.io/guide/