3.35Token 与斜杠杂项

框架内置了 Access Token 自动管理功能,只需实现 IHttpAccessTokenProvider 接口,并在 GetAsync 方法中编写获取 Access Token 的逻辑即可。通常情况下,获取 Access Token 需要借助独立的 HTTP 请求,而若在 GetAsync 内部直接使用 IHtt

禁用 Access Token 自动管理#

框架内置了 Access Token 自动管理功能,只需实现 IHttpAccessTokenProvider 接口,并在 GetAsync 方法中编写获取 Access Token 的逻辑即可。通常情况下,获取 Access Token 需要借助独立的 HTTP 请求,而若在 GetAsync 内部直接使用 IHttpRemoteService 发送请求,则会因触发自动管理机制而陷入递归死循环。此时,需通过 .WithoutTokenManagement() 显式禁用当前请求的 Access Token 自动管理,避免循环调用。

cs
public class CustomHttpAccessTokenProvider(IHttpRemoteService httpRemoteService): IHttpAccessTokenProvider{    /// <inheritdoc />    public async Task<HttpAccessToken?> GetAsync(CancellationToken cancellationToken)    {        var serverToken = await httpRemoteService.SendAsAsync<YourServerToken>(HttpRequestBuilder.Post("https://furion.net")                .SetJsonContent(new { username = "furion", password = "your-password"})                .WithoutTokenManagement());  // 跳过 Token 管理,避免递归调用(声明式请求使用 [SuppressTokenManagement])        return new HttpAccessToken(serverToken.Token, serverToken.ExpiresAt)    };}

设置 Access Token 请求的自定义数据#

当使用 IHttpAccessTokenProvider 自动获取 Access Token 时,有时需要向 GetAsync 方法传递额外的动态参数(如用户名、密码、客户端密钥等)。通过 WithAccessTokenData 方法,可以在构建请求时预设这些参数,框架会自动将它们复制到 HttpAccessTokenContext.Items 中,供 GetAsync 使用。

cs
HttpRequestBuilder.Post("https://furion.net/")    .SetHttpClientName("myapi") // 可选    .WithAccessTokenData("username", "admin")    .WithAccessTokenData("password", "123456")

然后,在 IHttpAccessTokenProvider.GetAsync 方法中,可以从 context.Items 中取出这些值:

cs
public async Task<HttpAccessToken?> GetAsync(HttpAccessTokenContext context, CancellationToken cancellationToken){    context.Items.TryGetValue("username", out var username);    context.Items.TryGetValue("password", out var password);    // 使用 username 和 password 获取 Token...}

注意:该方法支持多次调用,重复的键会用最新的值覆盖。

移除 URL 地址末尾的 /#

部分服务端对路径末尾的 / 敏感(如 /api//api),可能造成 301 重定向或路由匹配失败。开启该功能后,框架会在构造最终请求地址时自动去除路径末尾的 /

cs
HttpRequestBuilder.Post("https://furion.net/")    .RemoveTrailingSlash();HttpRequestBuilder.Post("https://furion.net/")    .RemoveTrailingSlash(false);    // 禁用该功能(默认值)

请求地址将变为 https://furion.net