WebAPI客户端

摘要:
附赠Nuget打包上传VS拓展工具一、前言上篇《 WebAPI使用多个xml文件生成帮助文档 》有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,WebAPI客户端(封装的HttpClient及WebAPI接口调用,其实包含在第2点内..)要源码的可以直接拉到最下面,      ///     WebApi2PostMan静态资源类      /// <
封装WebAPI客户端,附赠Nuget打包上传VS拓展工具
一、前言

上篇《 WebAPI使用多个xml文件生成帮助文档 》有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为定义的模型可能的用处有:

1:单元测试

2:其他项目引用(可能以Nuget包的形式)

3:WebAPI客户端(封装的HttpClient及WebAPI接口调用,其实包含在第2点内..)

要源码的可以直接拉到最下面,源码一如既往的还在那

二、为什么要封装WebAPI客户端

1:让WebAPI对于调用者来说“透明”,直接以引用程序集的方式。

2:统一项目内调用入口(当然了,非要绕过直接去请求接口肯定也是可以得,但是这是团队管理的问题)。

3:组合接口调用

4:版本化(通过Nuget,不论是自建还是Nuget.org)

三、封装的WebAPI客户端都包含些什么

这里继续使用 WebAPI2PostMan 项目来演示。

首先,因为将WebAPI的接口以HttpClient来进行封装,那至少需要定义出接口的请求路由,此处仅定义出了两处。

我们在解决方案新建一个类库项目,并将其命名为 WebAPI2PostMan.Client ,接着添加一个名为 WebApi2PostManStatic 的类

  1. using System.Configuration;  
  2.   
  3. namespace WebAPI2PostMan.Client  
  4. {  
  5.     /// <summary>  
  6.     ///     WebApi2PostMan静态资源类  
  7.     /// </summary>  
  8.     public class WebApi2PostManStatic  
  9.     {  
  10.         /// <summary>  
  11.         ///     服务地址  
  12.         /// </summary>  
  13.         public static string ServiceUrl = ConfigurationManager.AppSettings["WebAPI2PostManServiceUrl"];  
  14.         /// <summary>  
  15.         ///     获取所有产品  
  16.         /// </summary>  
  17.         public static string RouteProductGetAll = "api/Product/All";  
  18.         /// <summary>  
  19.         ///     添加产品  
  20.         /// </summary>  
  21.         public static string RouteProductAdd = "api/Product/Add";  
  22.     }  
  23. }  

接口请求无非就是Http的那几个方法,但此处仅认为我们的接口只包含Get和Post两种Http请求方法。

基于此,我们定义出一个WebApiHelper类。

  1. /// <summary>  
  2. ///     WebAPI帮助类  
  3. /// </summary>  
  4. public class WebApiHelper  
  5. {  
  6.     public static T1 CallPostWebApi<T1, T2>(string url, T2 request, string serviceUrl, int? timeOut = 10)  
  7.       
  8.   
  9.     public static T1 CallGetWebApi<T1>(string url, string serviceUrl, int? timeOut = 10)  
  10.      
  11.   
  12.     public static List<TResponse> CallWebApiBatch<TRequest, TResponse>(HttpMethod method, string endpoint, List<TRequest> batchRequestModels, string url, string serviceUrl, int? timeOut = 10)  
  13.       
  14.   
  15.     public static async Task<T1> CallPostWebApiAsync<T1, T2>(string url, T2 request, string serviceUrl, int? timeOut = 10)  
  16.      
  17.   
  18.     public static async Task<T1> CallGetWebApiAsync<T1>(string url, string serviceUrl, int? timeOut = 10)  
  19.      
  20.   
  21.     public static async Task<List<TResponse>> CallWebApiBatchAsync<TRequest, TResponse>(HttpMethod method,string endpoint,List<TRequest> batchRequestModels,string url,string serviceUrl,int? timeOut=10)  
  22. }  

为了节省篇幅和便于观看,将实现都删去了,可以看到定义了6个方法,分为同步和异步一共三类,Get , Post ,Batch(批量接口,有感兴趣的就下篇讲讲)。

然后,再添加一个用于封装的类 WebApi2PostManClient。

  1. using System.Collections.Generic;  
  2. using WebAPI2PostMan.WebModel;  
  3.   
  4. namespace WebAPI2PostMan.Client  
  5. {  
  6.     /// <summary>  
  7.     ///     WebApi2PostMan 客户端  
  8.     /// </summary>  
  9.     public class WebApi2PostManClient  
  10.     {  
  11.         /// <summary>  
  12.         ///     获取所有产品  
  13.         /// </summary>  
  14.         /// <param name="timeout">超时时间</param>  
  15.         /// <returns>产品列表</returns>  
  16.         public static IEnumerable<Product> GetAllProduct(int? timeout = 10)  
  17.         {  
  18.             return WebApiHelper.CallGetWebApi<IEnumerable<Product>>(WebApi2PostManStatic.RouteProductGetAll,WebApi2PostManStatic.ServiceUrl,timeout);  
  19.         }  
  20.         /// <summary>  
  21.         ///     添加产品  
  22.         /// </summary>  
  23.         /// <param name="request">添加的产品</param>  
  24.         /// <param name="timeout">超时时间</param>  
  25.         /// <returns>添加结果</returns>  
  26.         public static string AddProduct(Product request,int? timeout = 10)  
  27.         {  
  28.             return WebApiHelper.CallPostWebApi<string, Product>(WebApi2PostManStatic.RouteProductAdd, request,WebApi2PostManStatic.ServiceUrl, timeout);  
  29.         }  
  30.     }  
  31. }  
四、使用Nuget包管理器来发布WebAPI2PostMan.Client

怎么搭建NugetServer就不赘述了,新建一个空的web项目接着程序包控制台输入

  1. PM> Install-Package NuGet.Server  

然后该有的都会有了,直接发布到IIS即可。

此时,本地已经有一个NugetServer了,浏览如下。

image

右键项目 WebAPI2PostMan.Client => 属性 => 应用程序 => 程序集信息,补全一些信息。

image

运行命令行并定位到当前项目目录,执行

  1. nuget pack WebAPI2PostMan.Client.csproj -s http://localhost:88 123  

此处的nuget是配的环境变量,也可以替换成( 路径/NuGet.exe ),若启用了 NuGet 程序包还原的话,解决方案目录下的文件夹.nuget内会有NuGet.exe及其配置。

http://localhost:88 即为server地址,此处切不可加/nuget,否则会报403. 后面是密码,默认没设置的话会有警告并提示使用nuget setApiKey 设置。

那么其实一直以来都是做一个批处理脚本来打包并上传我们的包。

或者是dudu很久以前发的《用Nuget管理好自家的包包i》以及 http://www.cnblogs.com/lzrabbit/tag/NuGet/ 讲的都很详细。

还有《将nuget与VS直接集成,实现一键上传等功能》,只不过是需要手动设置的。

为了不想这么麻烦,顺手写了一个VS的拓展工具 Push2NuGet 来简化这些操作。

首先在 工具=》拓展和更新=》联机=》Visual Studio库 =》输入 Push2NuGet 安装,重启解决方案。

image

因为是一口气写出来的,没想好 一些服务参数放哪,就暂时扔到.nuget文件夹下,因此,需要在.nuget文件夹下 新建一个NuGet.xml的文件并完善信息。

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <SelfServer>  
  3.   <Url>http://localhost:88</Url>  
  4.   <ApiKey>123</ApiKey>  
  5. </SelfServer>  

然后右键项目点击【打包并上传】即可。

WebAPI客户端第4张

成功后显示。

image

新建一个 单元测试项目 WebAPI2PostMan.Tests 并在Nuget里设置Nuget源。

image

安装刚才上传的 WebAPI2PostMan.Client

image

添加两个单元测试方法

image

五、源码

示例源码:https://github.com/yanghongjie/WebAPI2PostMan

拓展工具:https://github.com/yanghongjie/Push2NugetServer

既然都看到这了,顺手评价再赏个推荐呗!

 

免责声明:文章转载自《WebAPI客户端》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java同步数据结构之LinkedBlockingDequeOracle 数据库监听配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hibernate环境搭建

1、导入jar包 hibernate.jar  antlr-2.7.6.jar  commons-collections-3.1.jar  jta-1.1.jar  dom4j-1.6.1.jar javassist-3.4.GA.jar  slf4j-api-1.5.2.jar  slf4j-log4j12-1.5.2.jar  假设使用C3P0数据源...

Django实战(二)之模板语言

该实战教程基于菜鸟教程,菜鸟教程可参考:http://www.runoob.com/django/django-template.html 模板语法,每个框架都有其支持的模板语法,Django的模板语法在我看来与vue.js倒有一些相似处 ,比如它们的模板语法中参数为{{parm}}。 本篇所用到的例子,仍然基于实战(一) 在HelloWorld(该文件夹...

dump redo日志文件的信息

通常会用到以下两个命令:1.'alter session'命令用来dump redo日志的文件头2.'alter system dump logfile'命令用来dump redo文件的内容 以上命令也可以对归档日志进行dump。输出结果存放在session的trace文件中。 可以根据以下方式对redo日志进行dump:(1) To dump recor...

Django安装和启动

    1.django安装 在http://www.djangoproject.com/download/这个网站上可以下载django的最新版本。在下载时,要注意django版本和本机安装的Python版本是匹配的。在这个https://docs.djangoproject.com/en/dev/faq/install/#what-python-ve...

Jira功能全介绍

转载自:http://casszuizui.blog.163.com/blog/static/33239220093224945258/ 虽说这些软件上手都挺容易的,但jira功能强大,值得发掘。 Jira&Confluence 1       JIRA 1.1    介绍 JIRA是一款问题跟踪工具,可以对各种类型的问题进行跟踪管理,包括缺陷、需...

IndexedDB:不仅仅是客户端持久化缓存技术ThingJS

本地缓存技术提升用户访问体验 IndexedDB(客户端缓存持久化)技术优势 大型3D项目本地缓存技术实测 简介:为提升用户访问体验,缩短项目加载时间,ThingJS平台推出3D场景本地缓存技术:IndexedDB,也称客户端缓存持久化技术。通俗来说,IndexedDB就是浏览器提供的本地数据库,它可以被网页脚本创建和操作,使用JSON数据格式。下面详...