【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/

WebApiClient 是一个基于 .NET Standard 2.0 的开源 HTTP 客户端类库,可以方便地进行 HTTP 请求操作。下面是使用 WebApiClient 发送 POST 请求的示例代码: ```csharp using WebApiClient; using WebApiClient.Attributes; public class MyApi : WebApiClient { public MyApi(string baseUrl) : base(baseUrl) { } [HttpPost("/api/user")] public ITask<string> CreateUser([FormContent] User user); public class User { public string Name { get; set; } public int Age { get; set; } } } // 发送 POST 请求 var api = new MyApi("http://example.com"); var user = new MyApi.User { Name = "John", Age = 30 }; var result = await api.CreateUser(user); Console.WriteLine(result); ``` 在上面的示例中,我们定义了一个名为 MyApi 的类,它继承自 WebApiClient 类。MyApi 类中定义了一个名为 CreateUser 的方法,用于向服务器发送 POST 请求。这个方法的参数使用了 [FormContent] 特性,表示要将 User 对象序列化为表单数据,并将其作为请求的内容发送到服务器。在发送请求时,我们需要先创建 MyApi实例,并指定服务器的基本 URL。然后,创建一个 User 对象,并将其传递给 CreateUser 方法。最后,等待方法返回的结果,并将结果打印到控制台上。 需要说明的是,这里使用的是异步方法,因此在调用方法时需要使用 await 关键字等待方法返回结果。同时,需要将代码放在异步方法中调用,或者使用 .GetAwaiter().GetResult() 等方式等待方法返回结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值