本篇文章的内容是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是在这样的背景下产生一款Http全异步的客户端库,它的出现,大幅度减轻了接口调用者的工作量,而且在调用Http接口上还非常容易维护和更新,还可以轻松应对设计不太友好的一些http接口。
使用WebApiClient,编程人员不再需要手动实现路径拼接、参数拼接、请求体组装和响应映射为模型这些繁琐的过程,以下为WebApiClient应用到项目中的一般流程:
[JsonReturn]
public interface IIotRemotePush : IDisposable
{
///
/// 创建远程推送账号
///
/// 授权
///
[HttpPost("/v1/RemotePush/CreateAccount")]
ITask
///
/// 获取推送服务信息
///
/// pushId
///
[HttpGet("/v1/Mqtt/GetPushSevice?id={id}")]
ITask
}
///
/// Api结果接口
///
public interface IApiResult
{
///
/// 错误码
///
ErrorCode Code { get; set; }
///
/// 相关提示信息
///
string Msg { get; set; }
}
///
/// 表示Api结果
///
public class ApiResult
{
///
/// 错误码
///
public ErrorCode Code { get; set; }
///
/// 相关提示信息
///
public string Msg { get; set; }
///
/// 业务数据
///
public T Data { get; set; }
}
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
{
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
{
// process exception
return default(ApiResult
})
.WhenCatch
{
// 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项目目前已加入.NET China Foundation,正在为.net开源作出自己的一点贡献。
原文:https://www.cnblogs.com/kewei/p/8529695.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com