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 自动管理,避免循环调用。
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 使用。
HttpRequestBuilder.Post("https://furion.net/") .SetHttpClientName("myapi") // 可选 .WithAccessTokenData("username", "admin") .WithAccessTokenData("password", "123456")然后,在 IHttpAccessTokenProvider.GetAsync 方法中,可以从 context.Items 中取出这些值:
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 重定向或路由匹配失败。开启该功能后,框架会在构造最终请求地址时自动去除路径末尾的 /。
HttpRequestBuilder.Post("https://furion.net/") .RemoveTrailingSlash();HttpRequestBuilder.Post("https://furion.net/") .RemoveTrailingSlash(false); // 禁用该功能(默认值)请求地址将变为 https://furion.net。