使用WebApiClient请求和管理Restful Api

前言

本篇文章的内容是WebApiClient应用说明篇,如果你没有了解过WebApiClient,可以先阅读以下相关文章:

  • WebApi client 的面向切面编程

  • 我来给.Net设计一款HttpClient

  • .Net45下HttpClient的几个缺陷

  • .net的retrofit--WebApiClient库

  • .net的retrofit--WebApiClient库深入篇

  • .net的retrofit--WebApiClient底层篇

背景

随着Wcf、Webservice等的SOAP的份额越来越少,以及Restful Api的兴起,目前几乎所有新平台提供的接口,都只提供Restful Api,而.net平台下,没有类似Wcf这么简单的客户端可以直接请求和管理这些Restful api的解决方案,.net平台提供的HttpWebRequest、WebClient和HttpClient这三个类库,可用于实现Http接口的请求,但相比wcf得益于soap自我描述实现的自动生成客户端调用代码,Restful就没这么方便了,无论使用HttpWebRequest还是HttpClient,都需要对每个Api缩写沉长的调用代码。

使用WebApiClient

WebApiClient是在这样的背景下产生一款Http全异步的客户端库,它的出现,大幅度减轻了接口调用者的工作量,而且在调用Http接口上还非常容易维护和更新,还可以轻松应对设计不太友好的一些http接口。

使用WebApiClient,编程人员不再需要手动实现路径拼接、参数拼接、请求体组装和响应映射为模型这些繁琐的过程,以下为WebApiClient应用到项目中的一般流程:

1 声明http接口的Interface

[JsonReturn]

public interface IIotRemotePush : IDisposable

{

    ///

    /// 创建远程推送账号

    ///

    /// 授权

    ///

    [HttpPost("/v1/RemotePush/CreateAccount")]

    ITask> CreateAccountAsync(IotBasicAuth auth);


    ///

    /// 获取推送服务信息

    ///

    /// pushId

    ///

    [HttpGet("/v1/Mqtt/GetPushSevice?id={id}")]

    ITask> GetPushSeviceAsync(string id);

}


///

/// Api结果接口

///

public interface IApiResult

{

    ///

    /// 错误码

    ///

      

    ErrorCode Code { get; set; }


    ///

    /// 相关提示信息

    ///

    string Msg { get; set; }

}



///

/// 表示Api结果

///

public class ApiResult : IApiResult

{

    ///

    /// 错误码

    ///

    public ErrorCode Code { get; set; }


    ///

    /// 相关提示信息

    ///

    public string Msg { get; set; }


    ///

    /// 业务数据

    ///

    public T Data { get; set; }

}


2 调用http接口

WebApiClient不需要开者实现接口,使用HttpApiClient.Create方法可以动态创建接口的实现类的实例,调用实例的方法,就完成一个Api的请求。

using (var iotApi = HttpApiClient.Create())

{

    var auth = new IotBasicAuth(config.AppId, config.AppToken);

    var createResult = await iotApi.CreateAccountAsync(auth);

    if (createResult.Code != ErrorCode.NoError)

    {

        return null;

    }


    config.PushId = createResult.Data.Id;

    config.PushToken = createResult.Data.Token;

    await db.SaveChangesAsync();


    return config;

}

3 异常定义与异常处理

在以上接口中,接口返回的都是ApiResult

///

/// 表示Iot异常

///

public class IotException : Exception

{

    ///

    /// 错误码

    ///

    public ErrorCode ErrorCode { get; private set; }


    ///

    /// Iot异常

    ///

    /// api结果值

    public IotException(IApiResult apiResult)

        : base(apiResult.Msg)

    {

        this.ErrorCode = apiResult.Code;

    }

}

我们还应该在Interface上扩展JsonResult,用于将ApiResult的ErrorCode转换为IotException,并抛出:

///

/// 表示IotJson结果

///

public class IotJsonResultAttribute : JsonReturnAttribute

{

    protected override async Task GetTaskResult(ApiActionContext context)

    {

        var apiResult = await base.GetTaskResult(context) as IApiResult;

        if (apiResult != null && apiResult.Code != ErrorCode.NoError)

        {

            throw new IotException(apiResult);

        }

        return apiResult;

    }

}


然后将新的IotJsonResultAttribute在Interface上替换JsonReturnAttribute:

[IotJsonResult]public interface IIotRemotePush : IDisposable{
   ...
}

最后,调用http接口的时候,可以使用Handle()扩展方法处理异常:

using (var iotApi = HttpApiClient.Create())

{

    var auth = new IotBasicAuth(config.AppId, config.AppToken);

    var createResult = await iotApi.CreateAccountAsync(auth)

        .Handle()

        .WhenCatch(ex =>

        {

            // process exception

            return default(ApiResult);

        })

        .WhenCatch(ex =>

        {

            // process exception

            return default(ApiResult);

        });


    if (createResult == null)

    {

        return null;

    }


    config.PushId = createResult.Data.Id;

    config.PushToken = createResult.Data.Token;

    await db.SaveChangesAsync();


    return config;

}

WebApiClient现状

WebApiClient项目目前已加入.NET China Foundation,正在为.net开源作出自己的一点贡献。

原文:https://www.cnblogs.com/kewei/p/8529695.html


 
   

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

你可能感兴趣的:(使用WebApiClient请求和管理Restful Api)