【C#】WebApiClient 实例

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值