封装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 的类
using System.Configuration; namespace WebAPI2PostMan.Client
{
/// <summary>
/// WebApi2PostMan静态资源类
/// </summary>
public class WebApi2PostManStatic
{
/// <summary>
/// 服务地址
/// </summary>
public static string ServiceUrl = ConfigurationManager.AppSettings["WebAPI2PostManServiceUrl"];
/// <summary>
/// 获取所有产品
/// </summary>
public static string RouteProductGetAll = "api/Product/All";
/// <summary>
/// 添加产品
/// </summary>
public static string RouteProductAdd = "api/Product/Add";
}
}接口请求无非就是Http的那几个方法,但此处仅认为我们的接口只包含Get和Post两种Http请求方法。
基于此,我们定义出一个WebApiHelper类。
/// <summary>
/// WebAPI帮助类
/// </summary>
public class WebApiHelper
{
public static T1 CallPostWebApi<T1, T2>(string url, T2 request, string serviceUrl, int? timeOut = 10) public static T1 CallGetWebApi<T1>(string url, string serviceUrl, int? timeOut = 10) public static List<TResponse> CallWebApiBatch<TRequest, TResponse>(HttpMethod method, string endpoint, List<TRequest> batchRequestModels, string url, string serviceUrl, int? timeOut = 10) public static async Task<T1> CallPostWebApiAsync<T1, T2>(string url, T2 request, string serviceUrl, int? timeOut = 10) public static async Task<T1> CallGetWebApiAsync<T1>(string url, string serviceUrl, int? timeOut = 10) public static async Task<List<TResponse>> CallWebApiBatchAsync<TRequest, TResponse>(HttpMethod method,string endpoint,List<TRequest> batchRequestModels,string url,string serviceUrl,int? timeOut=10)
}为了节省篇幅和便于观看,将实现都删去了,可以看到定义了6个方法,分为同步和异步一共三类,Get , Post ,Batch(批量接口,有感兴趣的就下篇讲讲)。
然后,再添加一个用于封装的类 WebApi2PostManClient。
using System.Collections.Generic;
using WebAPI2PostMan.WebModel; namespace WebAPI2PostMan.Client
{
/// <summary>
/// WebApi2PostMan 客户端
/// </summary>
public class WebApi2PostManClient
{
/// <summary>
/// 获取所有产品
/// </summary>
/// <param name="timeout">超时时间</param>
/// <returns>产品列表</returns>
public static IEnumerable<Product> GetAllProduct(int? timeout = 10)
{
return WebApiHelper.CallGetWebApi<IEnumerable<Product>>(WebApi2PostManStatic.RouteProductGetAll,WebApi2PostManStatic.ServiceUrl,timeout);
}
/// <summary>
/// 添加产品
/// </summary>
/// <param name="request">添加的产品</param>
/// <param name="timeout">超时时间</param>
/// <returns>添加结果</returns>
public static string AddProduct(Product request,int? timeout = 10)
{
return WebApiHelper.CallPostWebApi<string, Product>(WebApi2PostManStatic.RouteProductAdd, request,WebApi2PostManStatic.ServiceUrl, timeout);
}
}
}
四、使用Nuget包管理器来发布WebAPI2PostMan.Client
怎么搭建NugetServer就不赘述了,新建一个空的web项目接着程序包控制台输入
PM> Install-Package NuGet.Server然后该有的都会有了,直接发布到IIS即可。
此时,本地已经有一个NugetServer了,浏览如下。
右键项目 WebAPI2PostMan.Client => 属性 => 应用程序 => 程序集信息,补全一些信息。
运行命令行并定位到当前项目目录,执行
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的文件并完善信息。
<?xml version="1.0" encoding="utf-8"?>
<SelfServer>
<Url>http://localhost:88</Url>
<ApiKey>123</ApiKey>
</SelfServer>然后右键项目点击【打包并上传】即可。
成功后显示。
新建一个 单元测试项目 WebAPI2PostMan.Tests 并在Nuget里设置Nuget源。
安装刚才上传的 WebAPI2PostMan.Client
添加两个单元测试方法
五、源码
示例源码:https://github.com/yanghongjie/WebAPI2PostMan
拓展工具:https://github.com/yanghongjie/Push2NugetServer
既然都看到这了,顺手评价再赏个推荐呗!
封装WebAPI客户端,附赠Nuget打包上传VS拓展工具的更多相关文章
- nuget打包上传
准备工作 下载nuget.exe,以及gui推送编辑工具 Nuget Package Explorer (可选) 设置nuget环境变量. 流程 完成项目 cmd控制台cd到项目目录下(项目目录不是解 ...
- 【NuGet】打包上传一条龙服务
昨天写了搭建自己的NuGet程序源,但是领导不满意之前的打包上传~~,无奈只能去爬点思路了,这里参考的其他博文,但是还是想写下来. 第一步.建立一个批处理文件 在文件里,有三条命令: nuget pa ...
- Nuget多项目批量打包上传服务器的简明教程
本篇不会介绍Nuget是什么,如何打包上传Nuget包,怎么搭建私有Nuget服务器.这些问题园子里都有相应的文章分享,这里不做过多阐述.另外本文假设你已经下载了Nuget.exe,并且已经设置好了环 ...
- Asp.Net或WebAPI获取表单数据流(批量文件上传)
//Web或WebAPI获取表单数据流(批量文件上传) public JsonResult UploadFile() { //HttpPostedFi ...
- .net core3.1 webapi + element-ui upload组件实现文件上传
首先,先看我个人的的项目结构. 这个webapi项目是专门用来做图片上传,其中分为两个控制器:单图片上传和多图片上传.而我接下来主要讲的还是单文件上传,对于多文件的上传,我暂且尚未研究成功. 其中pi ...
- Java 客户端操作 FastDFS 实现文件上传下载替换删除
FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...
- Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):4、Maven项目转换与pom.xml配置
文章目录: Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):1.JIRA账号注册 Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):2.PGP ...
- 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传
前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...
- 打包上传成功, itunes connect 不出现上传的版本
由于有一次感觉build setting 里 code signing identity设置证书有点乱,有些已经用不到了,就想把那些删除 于是我找到了所有证书的那个文件夹(进入所有证书的那个文件夹), ...
随机推荐
- 编写可维护的JavaScript
第一章 1.基本的格式化 1.1推荐使用Tab键插入4分字符 1.2语句结尾要使用分号 1.3一行的长度最好不要超过80个字符 1.4通常在运算符后换行,下一行增加2个层级的缩进 1.5推荐在以下场景 ...
- 46. Permutations 回溯算法
https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...
- Extjs4.2或以上 使用自定义事件时报错问题
最近使用了extjs 自定义事件模型,代码如下: function Person(name) { this.name = name; this.addEvents('walk'); } Ext.ext ...
- Learning ROS for Robotics Programming - Second Edition(《学习ROS机器人编程-第二版》)
Learning ROS for Robotics Programming - Second Edition <学习ROS机器人编程-第二版> ----Your one-stop guid ...
- 各廠商ERP系統架構圖連結 (ERP流程圖)(轉)
各廠商ERP系統架構圖連結 (ERP流程圖) 資料來源 Google圖片搜尋ERP整理而來 資通電腦 ArgoERP 資通電腦 Oracle ERP 鼎新電腦 Workflow ERP鼎新電腦 S ...
- Linux文件目录权限总结
代表字符 权限 对文件含义 对目录含义 r 读权限 允许查看文件内容 允许列出目录中内容 w 写权限 允许修改文件内容 允许在目录中创建或删除文件 x 执行权限 允许执行文件 允许进入目录
- java反射机制初探
最近和一位师兄交流了一下Java,真可谓是大有收获,让我好好的学习了一下javad的反射机制,同终于明白了spring等框架的一个基本实现的思想,那么今天就和大家分享一下java的反射机制. 反射,r ...
- Android网页中tel,sms,mailTo,Intent,Market协议用法总结
tel:协议---拨打电话 <a href="tel:">调出拨号界面</a> <a href="tel:10086">调 ...
- log4net入门
简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...
- 免费的HTML5版uploadify送上
相信有不少同学用过uploadify这一款文件上传插件,它支持多文件选择.能显示进度条.可配置性高,总体来说是比较好用的.官网有两个版本供下载,分别是flash版和HTML5版.不过令人惋惜的是,HT ...







