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 =>{# 配置 HttpHosto.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 testawait 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");// 增加Tokencontext.HttpContext.RequestMessage.Headers.Add("X-Access-Token", tokenResult.Access_token);}}
请求流程及调用关系
注意:此图仅凭感觉绘制,用于方便理解调用顺序。不纠结对错及细节问题。
官方文档: webapiclient.github.io/guide/