目录
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将尝试获取新的访问令牌。由应用程序提供,检查现有访问令牌的过期时间,并在需要时获取新的访问令牌。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。








