使用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 { /// <summary> /// 创建远程推送账号 /// </summary> /// <param name="auth">授权</param> /// <returns></returns> [HttpPost("/v1/RemotePush/CreateAccount")] ITask<ApiResult<PushAccount>> CreateAccountAsync(IotBasicAuth auth); /// <summary> /// 获取推送服务信息 /// </summary> /// <param name="id">pushId</param> /// <returns></returns> [HttpGet("/v1/Mqtt/GetPushSevice?id={id}")] ITask<ApiResult<MqttService>> GetPushSeviceAsync(string id); } /// <summary> /// Api结果接口 /// </summary> public interface IApiResult { /// <summary> /// 错误码 /// </summary> ErrorCode Code { get; set; } /// <summary> /// 相关提示信息 /// </summary> string Msg { get; set; } } /// <summary> /// 表示Api结果 /// </summary> public class ApiResult<T> : IApiResult { /// <summary> /// 错误码 /// </summary> public ErrorCode Code { get; set; } /// <summary> /// 相关提示信息 /// </summary> public string Msg { get; set; } /// <summary> /// 业务数据 /// </summary> public T Data { get; set; } }
2 调用http接口
WebApiClient不需要开者实现接口,使用HttpApiClient.Create方法可以动态创建接口的实现类的实例,调用实例的方法,就完成一个Api的请求。
using (var iotApi = HttpApiClient.Create<IIotRemotePush>()) { 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
/// <summary> /// 表示Iot异常 /// </summary> public class IotException : Exception { /// <summary> /// 错误码 /// </summary> public ErrorCode ErrorCode { get; private set; } /// <summary> /// Iot异常 /// </summary> /// <param name="apiResult">api结果值</param> public IotException(IApiResult apiResult) : base(apiResult.Msg) { this.ErrorCode = apiResult.Code; } }
我们还应该在Interface上扩展JsonResult,用于将ApiResult的ErrorCode转换为IotException,并抛出:
/// <summary> /// 表示IotJson结果 /// </summary> public class IotJsonResultAttribute : JsonReturnAttribute { protected override async Task<object> 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<IIotRemotePush>()) { var auth = new IotBasicAuth(config.AppId, config.AppToken); var createResult = await iotApi.CreateAccountAsync(auth) .Handle() .WhenCatch<IotException>(ex => { // process exception return default(ApiResult<PushAccount>); }) .WhenCatch<Exception>(ex => { // process exception return default(ApiResult<PushAccount>); }); 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开源作出自己的一点贡献。
- 使用WebApiClient请求和管理Restful Api
- 使用SpringMvc 开发 RESTful API 用户详情请求、JsonView注解使用(二)
- 使用Kong来管理业务侧restful api
- 使用Kong来管理业务侧restful api
- httpclient连接池在ES Restful API请求中的应用
- [随记] 使用httpClient发送post请求连接restful接口
- 使用VMware Infrastructure Client中的VMware Server 2.0.x的管理
- 负载均衡之---应用请求路由模块的使用(ARR)(六)[使用ARR管理试点方案(涉及到了A/B Testing)]
- 网络请求之HttpClient 类的使用
- FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置
- 数据库管理工具——SQuirreL SQL Client使用入门
- 使用事务管理抽象API进行事务界定的代码示例
- linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
- 转载:FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置
- Android-网络请求数据使用apache httpclient v4
- 使用HTTP POST请求12306网站接口查询火车车次API
- Restful服务中Delete请求能否使用Entity body
- web developer tips (36):使用IIS7.0 应用请求路由模块管理网站的beta版程序
- sina kanyun 应用api-client使用问题 修改
- 使用 WinInte API 发送 HTTP 请求