【C#】WebApiClient 实例

ops/2025/3/7 2:56:27/

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/


http://www.ppmy.cn/ops/163763.html

相关文章

Python 面向对象高级编程-定制类

目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意&#xff0c;这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了&#xff0c;__len__()方法我们也知道是为了能让class作用于len()…

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种&#xff1a;基本类型和标准库类型&#xff0c;前者由语言特性直接提供&#xff0c;后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串&#xff0c;但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…

huggingface镜像站hf-mirror的各大AI模型文件下载

一、说明 huggingface地址&#xff1a;https://huggingface.co 但是由于需要国外网络&#xff0c;国内网络延迟较大或无法下载&#xff0c;所以使用国内镜像站&#xff1a; hf-mirror地址&#xff1a;https://hf-mirror.com/ 二、下载方法 1.本机安装了GIT 2.打开HF-Mirro…

【Qt】Qt Widgets和QML(Qt Quick)开发界面的区别

Qt 提供了两种主要的 UI 技术&#xff1a;Qt Widgets 和 QML&#xff08;Qt Quick&#xff09;。它们的核心区别主要体现在使用方式、架构、性能、开发难度和适用场景等方面。 1. Qt Widgets vs. QML 总体对比 对比项Qt WidgetsQML (Qt Quick)语言C (带 Qt UI 库)QML JavaScr…

CSS的列表属性

列表相关属性,可以用在ul,ol,li元素上. CSS属性名功能属性值 list-style-type 设置列表符号 常用值如下: none:不显示前面的标识(很常用!) square:实心方块 disc:圆形 decimal:数字 lower-roma:小写罗马字 upper-roman:大写罗马字 lower-alph:小写字母 upper-alpha:大写字母 …

【损失函数_模型结构与前向传播的数学建模】

在深度学习中&#xff0c;通过目标函数&#xff08;如结合Sigmoid激活函数的交叉熵损失&#xff09;训练模型的过程&#xff0c;本质上是通过梯度反向传播对参数进行迭代优化的数学过程。以下从数学原理、计算步骤和动态行为三个层面深入剖析其工作机制&#xff1a; 一、模型结…

批量修改或设置 Word 标题、主题、标记、作者、总编辑时间等元数据

前面我们介绍过元数据的重要性&#xff0c;也介绍过如何批量清空 Word 文档的元数据。那如果我们需要设置或者修改 Word 文档的元数据我们应该怎么做呢&#xff1f;我们还能使用之前介绍的方法来帮我们完成批量修改 Word 文档元数据的操作吗&#xff1f;答案是可以的&#xff0…

如何使用go本地编译caddy插件

CGO_ENABLED1 /root/go/bin/xcaddy build --with github.com/yourusername/formhandler --replace github.com/yourusername/formhandler. 含义&#xff1a;CGO_ENABLED1好像是使用了某库 CGO 支持缺失&#xff1a;go-sqlite3 是一个基于 CGO 实现的 SQLite 驱动&#xff0c;…