调用WebApi其实就是发起Web请求来获取结果,使用第三方的类库可以提高开发速度,接下来简单介绍一下refit.

项目地址

refit是一个开源项目,同时支持.NET Core, Xamarin and .NET,GitHub:https://github.com/paulcbetts/refit

快速开始

refit的使用方式是通过定义接口来对应WebApi接口,例如:

public interface IGitHubApi
{
    [Get("/users/{user}")]
    Task<User> GetUser(string user);
}

然后通过 RestService 类来生成接口 IGitHubApi 的实现并通过 HttpClient 来调用WebApi:

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");

var octocat = await gitHubApi.GetUser("octocat");

API Attributes

每种方法都必须具有提供请求方法和相对的URL路径。一共有5种:Get, Post, Put, Delete, and Head:

[Get("/users/list")]

也可直接将参数写到URL中:

[Get("/users/list?sort=desc")]

每个请求的URL,都可以使用大括号“{}”替换的方式来动态生成,如果参数的名称不匹配,可以使用别名:

[Get("/group/{id}/users")]
Task<List<User>> GroupList([AliasAs("id")] int groupId);

如果参数没有在URL中定义也会自动加到请求的URL中,例如sort没有定义:

[Get("/group/{id}/users")]
Task<List<User>> GroupList([AliasAs("id")] int groupId, [AliasAs("sort")] string sortOrder);

GroupList(4, "desc");
>>> "/group/4/users?sort=desc"

动态参数

如果将一个类型实例作为参数,那么它的所有的非空的public的属性都会作为参数来使用,还可以使用Query特性来整理你的参数:

public class MyQueryParams
{
    [AliasAs("order")]
    public string SortOrder { get; set; }

    public int Limit { get; set; }
}


[Get("/group/{id}/users")]
Task<List<User>> GroupList([AliasAs("id")] int groupId, MyQueryParams params);

[Get("/group/{id}/users")]
Task<List<User>> GroupListWithAttribute([AliasAs("id")] int groupId, [Query(".","search")] MyQueryParams params);


params.SortOrder = "desc";
params.Limit = 10;

GroupList(4, params)
>>> "/group/4/users?order=desc&Limit=10"

GroupListWithAttribute(4, params)
>>> "/group/4/users?search.order=desc&search.Limit=10"

更详细的使用方式,请参阅官方的文档:http://paulcbetts.github.io/refit