自动类型安全的REST.NET标准库refit

2022-04-19 09:33:37
目录
1.简介2.API属性3.动态查询字符串参数(Dynamic Querystring Parameters)4.集合作为查询字符串参数(Collections as Querystring Parameters)5.转义符查询字符串参数(Unescape Querystring Parameters)6.Body内容6.1.jsON内容6.2XML内容6.3.表单发布(Form posts)7.设置请求头7.1静态头(Static headers)7.2动态头(Dynamic headers)7.3授权(动态头redux)

1.简介

Refit是一个受到Square的Retrofit库(java)启发的自动类型安全REST库。通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST API返回的数据转化为POCO(Plain Ordinary C# Object,简单C#对象) to JSON。我们的应用程序通过Refit请求网络,实际上是使用Refit接口层封装请求参数、Header、Url等信息,之后由HttpClient完成后续的请求操作,在服务端返回数据之后,HttpClient将原始的结果交给Refit,后者根据用户的需求对结果进行解析的过程。安装组件命令行:

Install-Package refit

代码例子:

[Headers("User-Agent: Refit Integration Tests")]//这里因为目标源是githubApi,所以一定要加入这个静态请求标头信息,让其这iRkjRga是一个测试请求,不然会返回数据异常。public interface IGitHubApi{    [Get("/users/{user}")]    Task<User> GetUser(string user);}public class GitHubApi{    public async Task<User> GetUser()    {        var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");        var octocat = await gitHubApi.GetUser("octocat");        return octocat;    }}public class User{    public string login { get; set; }    public int? id { get; set; }    public string url { get; set; }}[HttpGet]public async Task<ActionResult<IEnumerable<string>>> Get(){    var result = await new GitHubApi().GetUser();    return new string[] { result.id.Value.ToString(), result.login };}

注:接口中Headers、Get这些属性叫做Refit的特性。ken).ConfigureAwait(false); }}

或者:

class AuthenticatedParameterizedHttpClientHandler : DelegatingHandler    {        readonly Func<HttpRequestMessage, Task<string>> getToken;        public AuthenticatedParameterizedHttpClientHandler(Func<HttpRequestMessage, Task<string>> getToken, HttpMessageHandler innerHandler = null)            : base(innerHandler ?? new HttpClientHandler())        {            this.getToken = getToken ?? throw new ArgumentNullException(nameof(getToken));        }        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)        {            // See if the request has an authorize header            var auth = request.Headers.Authorization;            if (auth != null)            {                var token = await getToken(request).ConfigureAwait(false);                request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, token);            }            return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);        }    }

虽然HttpClient包含一个几乎相同的方法签名,但使用方式不同。重新安装未调用HttpClient.SendAsync。必须改为修改HttpClientHandler。此类的用法与此类似(示例使用ADAL库来管理自动令牌刷新,但主体用于Xamarin.Auth或任何其他库:

class LoginViewModel{    AuthenticationContext context = new AuthenticationContext(...);    private async Task<string> GetToken()    {        // The AcquireTokenAsync call will prompt with a UI if necessary        // Or otherwise silently use a refresh token to return        // a valid access token            var token = await context.AcquireTokenAsync("http://my.service.uri/app", "clientId", new Uri("callback://complete"));        return token;    }    public async Task LoginAndCallApi()    {        var api = RestService.For<IMyRestService>(new HttpClient(new AuthenticatedHttpClientHandler(GetToken)) { BaseAddress = new Uri("https://the.end.point/") });        var location = await api.GetLocationOfRebelBase();    }}interface IMyRestService{    [Get("/getPublicInfo")]    Task<Foobar> SomePublicMethod();    [Get("/secretStuff")]    [Headers("Authorization: Bearer")]    Task<Location> GetLocationOfRebelBase();}

在上面的示例中,每当调用需要身份验证的方法时,AuthenticatedHttpClientHandler将尝试获取新的访问令牌。由应用程序提供,检查现有访问令牌的过期时间,并在需要时获取新的访问令牌。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。