WebAPI客户端

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

接口请求无非就是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. public static T1 CallGetWebApi<T1>(string url, string serviceUrl, int? timeOut = 10)
  8. public static List<TResponse> CallWebApiBatch<TRequest, TResponse>(HttpMethod method, string endpoint, List<TRequest> batchRequestModels, string url, string serviceUrl, int? timeOut = 10)
  9. public static async Task<T1> CallPostWebApiAsync<T1, T2>(string url, T2 request, string serviceUrl, int? timeOut = 10)
  10. public static async Task<T1> CallGetWebApiAsync<T1>(string url, string serviceUrl, int? timeOut = 10)
  11. public static async Task<List<TResponse>> CallWebApiBatchAsync<TRequest, TResponse>(HttpMethod method,string endpoint,List<TRequest> batchRequestModels,string url,string serviceUrl,int? timeOut=10)
  12. }

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

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

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

四、使用Nuget包管理器来发布WebAPI2PostMan.Client

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

  1. PM> Install-Package NuGet.Server

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

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

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

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

  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 安装,重启解决方案。

因为是一口气写出来的,没想好 一些服务参数放哪,就暂时扔到.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>

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

成功后显示。

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

安装刚才上传的 WebAPI2PostMan.Client

添加两个单元测试方法

五、源码

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

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

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

时间: 2024-10-17 22:38:15

WebAPI客户端的相关文章

封装WebAPI客户端,附赠Nuget打包上传VS拓展工具

一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为定义的模型可能的用处有: 1:单元测试 2:其他项目引用(可能以Nuget包的形式) 3:WebAPI客户端(封装的HttpClient及WebAPI接口调用,其实包含在第2点内..) 要源码的可以直接拉到最下面,源码一如既往的还在那. 二.为什么要封装WebAPI客户端 1:让WebAPI对于调用者来说“透明”,直接以引用程序集的方式. 2:统一项目内调用入口(当然

WebApi用JilFormatter处理客户端序列化的字符串加密,之后在服务端解析。

本文有改动,参考原文:https://www.cnblogs.com/liek/p/4888201.html https://www.cnblogs.com/tonykan/p/3963875.html 功能背景:WebApi 客户端 一个Model 序列化为string类型,想将其加密之后再Post到服务端,在服务端解析出来再处理. Jil.dll 安装: 然后: 选择项目,输入 Install-Package Jil 回车. 然后创建一个JilFormatter类,代码如下: using J

WebAPI使用多个xml文件生成帮助文档

一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xml文档来作为数据源从而展示出来的.在我们的项目帮助文档需要的类(特指定义的Request和Response)与项目在同一个项目时是没有问题的,但是我们实际工作中会因为其他项目也需要引用该(Request和Response)时,我们会将其抽出来单独作为一个项目供其它调用来引用,这时,查看帮助文档不会报

【转】WebAPI使用多个xml文件生成帮助文档

来自:http://www.it165.net/pro/html/201505/42504.html 一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xml文档来作为数据源从而展示出来的.在我们的项目帮助文档需要的类(特指定义的Request和Response)与项目在同一个项目时是没有问题的,但是我们实际工作中会因为其他项目也需要引用该(Reque

WebAPI使用多个xml文件生成帮助文档(转)

http://www.cnblogs.com/idoudou/p/xmldocumentation-for-web-api-include-documentation-from-beyond-the-main.html 一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xml文档来作为数据源从而展示出来的.在我们的项目帮助文档需要的类(特指定义的Req

我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践

写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯新湖,鱼跃翠堤:第一次念你,燕飞巢冷,释怀记忆:第一次梦你,云翔海岛,轮渡迤逦:第一次认你,怨江别续,草桥知己:第一次怕你,命悬一线,遗憾禁忌:第一次悟你,千年菩提,生死一起. 人生有很多的第一次:小时候第一次牙牙学语.第一次学蹒跚学步...长大后第一次上课.第一次逃课.第一次骑自行车.第一次懂事.第一次和喜

Web API项目中使用Area对业务进行分类管理

在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加很快,难以管理,而且如果有不同业务模块有重复的控制器名的话,还需要尽量避免.引入Area的作用就是把控制器按照不同的业务模块进行区分,方便管理,而且控制器名称可以重名. 1.Web API项目引入Area进行分类 Area在项目中可以称之为区域,每个Area代表应用程序的不同功能模块,Area 使每

使用多个项目生成Xml文件来显示帮助文档

终于到这了,我们首先将Product单独作为一个项目 WebAPI2PostMan.WebModel 并引用他,查看文档如下. 你会发现,你的注释也就是属性的描述没有了.打开App_Data/XmlDocument.xml文件对比之前P没移动roduct的xml文件确实Product类的描述确实没有了,因为此处的XmlDocument.xml文件是项目的生成描述文件,不在此项目 内定义的文件是不会生成在这个文件内的,那真实的需求是我们确确实实需要将所有Request和Response单独定义在一

快速入门系列--WebAPI--03框架你值得拥有

接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI,其核心概念就是构建REST风格的Web服务,把一起数据视为资源,无论是服务请求或者是数据操作,与以前的SOAP和XML-RPC架构风格有很大不同.说道这,很多读者可能想到WCF中不是早都有了REST风格的服务么,为什么还需要这个WebAPI?确实如此,不过WCF中的该类型服务显得比较复杂,因为其通