Swagger是一种与技术无关的标准,允许发现REST API,为任何软件提供了一种识别REST API功能的方法。

这比看起来更重要:这是一个改变游戏技术的方式,就像Web服务描述语言一样WSDL(Web Service Description Language)一样

WSDL一直是使Visual Studio等工具和IDE 可以理解Web服务并创建代理类的基础技术。此功能将Web服务的消耗转换为高级任务,封装所有协议详细信息。

这是Swagger的重要性:它可以为REST API做出WSDL已经为Web服务所做的工作,允许创建代理和使用Web API更容易。

VS 2017包括使用Swagger协议支持REST API代理创建。它还处于早期阶段,缺乏一些特点,但这是向广泛采用Swagger迈出的重要一步。

我们将创建一个例子,说明我们如何使用Swagger与VS 2017来分析优势和缺少的功能。

以及VS 2017,我们还将需要安装在开发机器中的IIS(Internet Information Server)作为示例。

发展环境

您可以将IIS作为Windows功能或服务器角色启用,具体取决于您是否使用客户端操作系统或服务器角色。

开始申请

在我们可以使用Swagger之前,我们需要一个具有Web API项目的演示解决方案。我们来构建这个开始的解决方案,然后再继续实施Swagger。

  1. 创建ASP.NET Web API项目
    1. 在Visual Studio中,选择“文件” - > “新建项目”菜单
    2. “新建项目”对话框的左侧树视图中,选择“已安装” - > “模板” - > “Visual C#” - > “Web”树项目。
    3. “新建项目”对话框的右侧,选择“ASP.NET Web应用程序(.NET Framework)”

“名称”文本框中,键入“webDemo”

    1. “解决方案名称”文本框中,键入“slDemo”,然后单击“确定”按钮

“新ASP.NET Web应用程序”窗口中,在“ASP.NET 4.5.2模板”下,选择“Web API”,然后单击“确定”按钮

  1. 配置Web API项目以使用本地IIS
    1. “解决方案资源管理器”窗口中,右键单击“webDemo”项目,然后单击“属性”菜单项。
    2. “webDemo”属性窗口的右侧,单击“Web”页面

“服务器”下的组合框中,选择“本地IIS”

    1. 单击“创建虚拟目录”按钮
    2. 关闭'webDemo'属性页面

该项目已经开发了一个Web API控件示例,但是我们需要进行一些更改。我们来看一下现有控制器的细节,并做出这些改变。

  1. 分析和更改现有的API控制器
    1. “解决方案资源管理器”窗口的“webDemo”项目中,打开“控制器”文件夹并检查现有的控制器。

    2. 双击“ValuesController.cs”文件并检查现有操作。这是项目中唯一的Web API控制器。

更改下面的代码的“ValuesController”类。我们正在完成PUT操作并将该列表存储在Application memory区域内。

 
 
    public class ValuesController : ApiController
      {
          private string[] lista
          {
              get
              {
                  if (System.Web.HttpContext.Current.Application[<em>"lista"</em>]==null)
                  {
                      System.Web.HttpContext.Current.Application[<em>"lista"</em>] =
                          new string[] { <em>"value1"</em>, <em>"value2"</em> };
                  }
                  return
                      (string[])System.Web.HttpContext.Current.Application[<em>"lista"</em>];
              }
          }
          public IEnumerable<string> Get()
          {
              return lista;
          }
          public string Get(int id)
          {
              return lista[id];
          }
          public void Post([FromBody]string value)
          {
          }
          public void Put(int id, [FromBody]string value)
          {
              lista[id] = value;
          }
          public void Delete(int id)
          {
          }
      }
  1. 执行应用程序并分析结果
    1. 单击工具栏中的“开始”按钮执行应用程序

在刚刚打开的网页上,点击顶部菜单中的“API”链接。您将注意到API操作,基本上是一个具有两个GET的 CRUD ,一个POSTPUTDELETE

在浏览器导航栏中,键入新的URL:http:// localhost / webDemo / API / Values。因此,将下载一个JSON文件,因此该Web API正常工作。

在我们的项目中包括Swagger

Swagger是一项技术无关的协议。对于每种技术,我们需要一些实现协议的工具。SwashBuckle是.NET工具的名称。4.5之前的.NET版本和4.5之后的.NET的另一个版本。

让我们逐步练习使用SwashBuckle来实现Swagger :

  1. 在Web API项目中 包含SwashBuckle nugget包
    1. 在“ 解决方案资源管理器”窗口中,右键单击“webDemo”项目,然后单击“管理nuget数据包”菜单项。
    2. “Nuget包管理器”窗口中,选择“浏览”
    3. “Nuget软件包管理器”窗口中的文本框中,键入“SwashBuckle”

“Nuget软件包管理器”窗口的左侧,选择“SwashBuckle.Net45”软件包

    1. “Nuget软件包管理器”窗口的右侧,单击“安装”按钮。
    2. “查看更改”窗口中,单击“确定”按钮。
    3. “许可验收”窗口中,单击“我接受”按钮。
    4. 关闭“Nuget软件包管理器”窗口
  1. 配置XML文档。SwashBuckle将使用XML文档来描述WEB API操作。
    1. “解决方案资源管理器”窗口中,右键单击“webDemo”项目,然后单击“属性”菜单项。
    2. “webDemo”窗口中,单击“构建”页面

'webDemo'窗口中的“输出”下方,单击“Xml文档文件”复选框。在右边的文本框中,您将看到路径“bin \ webDemo.xml”

    1. “解决方案资源管理器”窗口的“webDemo”项目中,打开“控制器”文件夹,然后双击“ValuesController.cs”文件。
    2. 我们为每个动作和控制器创建一个XML文档。通过每个动作,并通过控制器声明,键入'///'并描述动作和控制器。
              /// <summary>
                /// Retrieves the list of values
                /// </summary>
                /// <returns></returns>
                public IEnumerable<string> Get()
                {
                    return lista;
                }
                /// <summary>
                /// Retrieves one value from the list of values
                /// </summary>
                /// <param name=<em>"id"</em>>The id of the item to be retrieved</param>
                /// <returns></returns>
                public string Get(int id)
                {
                    return lista[id];
                }
                /// <summary>
                /// Insert a new value in the list
                /// </summary>
                /// <param name=<em>"value"</em>>New value to be inserted</param>
                public void Post([FromBody]string value)
                {
                }
                /// <summary>
                /// Change a single value in the list
                /// </summary>
                /// <param name=<em>"id"</em>>The id of the value to be changed</param>
                /// <param name=<em>"value"</em>>The new value</param>
                public void Put(int id, [FromBody]string value)
                {
                    lista[id] = value;
                }
                /// <summary>
                /// Delete an item from the list
                /// </summary>
                /// <param name=<em>"id"</em>>id of the item to be deleted</param>
                public void Delete(int id)
                {
                }
  1. 配置SwashBuckle。现在,我们需要做的唯一配置就是XML文档的路径。
  2. “解决方案资源管理器”窗口的“webDemo”项目中,打开“App_Start”文件夹,然后双击“SwaggerConfig.cs”文件。该文件由“SwashBuckle.Net45” nuget软件包包含在该项目中。

    “SwaggerConfig”类 的“注册”方法被配置为作为“PreApplicationStartMethod”执行。

    1. “SwaggerConfig”类中包含以下方法:

              protected static string GetXmlCommentsPath()
                {
                    return System.String.Format(@<em>"{0}\bin\webDemo.XML"</em>,
                        System.AppDomain.CurrentDomain.BaseDirectory);
                }
    2. “注册”方法中取消注释以下代码块:
                              c.IncludeXmlComments(GetXmlCommentsPath());
  3. 执行并测试应用程序
    1. 执行应用程序,单击工具栏中的“开始”按钮。
    2. 在浏览器地址栏中输入以下URL:http:// localhost / webDemo / Swagger / ui / index

在Swagger文档页面上,单击“值”,控制器的名称。

    1. 单击每个操作以查看文档。您可能会注意到Swagger正在使用每个操作的XML文档描述。
    2. 在浏览器地址栏中输入以下URL:http:// localhost / webDemo / Swagger / docs / v1。这一次我们正在寻找描述Web API 的JSON文档,这是SwashBuckle的核心结果
    3. 在出现的问题中,点击“保存”按钮(我正在使用Chrome,这可能与其他浏览器有所不同)
    4. 在出现的消息中,单击“打开文件夹”按钮。(我正在使用Chrome,这可能与其他浏览器有所不同)

用记事本 打开v1.json文件。该文件的格式不会很好,但内容却是对Web API的描述,如下图所示。如果您愿意,可以在Visual Studio中打开该文件,以查看文件格式正确的版本。

    1. 停止Visual Studio中的执行

创建客户端项目

现在是时候创建一个客户端来消费我们的Web API,并说明这个消费将如何容易多了。

  1. 向该解决方案添加一个新的Windows桌面项目
    1. 在Visual Studio中,单击菜单中的 “文件” - > “添加” - > “新建项目”
    2. “新建项目”对话框的左侧树视图中,选择“安装” - > “模板” - > “Visual C#” - > “Windows经典桌面”树项目。
    3. “新建项目”对话框的右侧,选择“Windows Forms App(.NET Framework)”
    4. “名称”文本框中,键入“winClient”,然后单击“确定”按钮
  2. 添加对Web API的引用并创建代理

“解决方案资源管理器”窗口中,右键单击“winClient”项目,单击“添加” - > “REST API客户端”菜单项。

    1. In the ‘Add REST API Client’ window, ‘Swagger Url’ textbox, type http://localhost/webDemo/Swagger/docs/v1 .

In the ‘Client Namespace’ textbox, type ‘SvcRest’ and click the ‘Ok’ button.

It seems that nothing happened. Inside ‘Web Publish Activity’ window you will be able to see what happened and an error message: ‘Found operation object with duplicate OperationId ‘Values_Get’. OperationId must be unique among all operations described in the API’.

The client tool doesn’t support a REST API with operation overload, and our demo API has two GET methods. We need to resolve this problem before we proceed.

Support for operation overload

这种缺乏对操作超载的支持是一个很大的缺陷,因为即使是您可能注意到的演示Web API应用程序也使用操作重载,它有两个GET操作,带有和不带参数。

有两种可能的解决方案:

  • 更改操作名称以避免过载
  • 实现一个可以拦截JSON文件创建的操作过滤器,避免JSON文件中的重载。

让我们逐步实现一个操作过滤器:

  1. 为解决方案添加一个新的类库
    1. 在“ 解决方案资源管理器”窗口中,右键单击解决方案,单击“添加” - > “新建项目”上下文菜单项
    2. “新建项目”对话框的左侧树视图中,选择“安装” - > “模板” - > “Visual C#” - > “Windows经典桌面”树项目。
    3. “新建项目”对话框的右侧,选择“类库(.NET Framework)”

“名称”文本框中,键入“libTools”,然后单击“确定”按钮

    1. “解决方案资源管理器”窗口中,右键单击“Class1.cs”文件,在“libTools”项目下,单击“删除”菜单项。
  1. 在新的Class Library项目中 安装“SwashBuckle.Core.Net45”软件包。我只安装SwashBuckle的核心,而不是所有的库。
    1. “解决方案资源管理器”窗口中,右键单击“libTools”项目,然后单击“管理nuget数据包”菜单项。
    2. “Nuget包管理器”窗口中,选择“浏览”
    3. “Nuget软件包管理器”窗口中的文本框中,键入“SwashBuckle”
    4. “Nuget包管理器”窗口的左侧,选择“SwashBuckle.Core.Net45”
    5. “Nuget软件包管理器”窗口的右侧,单击“安装”按钮。
    6. “查看更改”窗口中,单击“确定”按钮。
    7. “许可验收”窗口中,单击“我接受”按钮。
  2. 实现操作过滤器
    1. “解决方案资源管理器”窗口中,右键单击“libTools”项目,单击“添加” - > “类...”上下文菜单项

“添加新项目”窗口中,在“名称”文本框中键入“MultipleOperationsWithSameVerbFilter.cs”

    1. 复制下面的代码并粘贴到新文件中,替换空类:

          using Swashbuckle.Swagger;
            using System.Web.Http.Description;
            public class MultipleOperationsWithSameVerbFilter : IOperationFilter
            {
                public void Apply(
                    Operation operation,
                    SchemaRegistry schemaRegistry,
                    ApiDescription apiDescription)
                {
                    if (operation.parameters != null)
                    {
                        operation.operationId += "By";
                        foreach (var parm in operation.parameters)
                        {
                            operation.operationId += string.Format("{0}",
                                parm.name);
                        }
                    }
                }
  1. “webDemo”工程,引用添加到“libTools”项目
    1. “解决方案资源管理器”窗口中,右键单击“webDemo”项目,单击“添加” - > “参考”上下文菜单项
    2. “参考管理器”窗口的左侧,选择“项目” - > “解决方案”

“参考管理器”窗口的右侧,选中'libTools'以外的框,然后单击“确定”按钮

  1. 更改Swagger配置以使用新的操作过滤器
    1. “解决方案资源管理器”窗口的“webDemo”项目中,打开“App_Start”文件夹,然后双击“SwaggerConfig.cs”文件。
    2. “SwaggerConfig.cs”文件的顶部,添加以下行:
      using libTools;
    3. “注册”方法中,在以下块中:
                  GlobalConfiguration.Configuration
                        .EnableSwagger(c =>
                            {

      添加以下代码行:

                              c.OperationFilter<MultipleOperationsWithSameVerbFilter>();

“解决方案资源管理器”窗口中,右键单击解决方案,然后单击“重建解决方案”菜单项

  1. 重复客户端代理创建的步骤2,这一次它将工作。

在客户端应用程序中使用代理

现在Web API代理是建立在客户端项目中的,现在是使用它来访问Web API的时候了。但是,代理需要一个额外的类来控制身份验证。这个功能的另一个缺点是它对匿名认证的处理不好,但是我们可以通过快速解决来克服这个问题。

    1. 'libTools'项目中 安装'Microsoft.Rest.ClientRuntime'包。这个包是我们修复需要的。
      1. “解决方案资源管理器”窗口中,右键单击“libTools”项目,然后单击“管理nuget数据包”菜单项。
      2. “Nuget包管理器”窗口中,选择“浏览”
      3. “Nuget软件包管理器”窗口的文本框中,键入“Microsoft.Rest.ClientRuntime”
      4. “Nuget包管理器”窗口的左侧,选择“Microsoft.Rest.ClientRuntime”
      5. “Nuget软件包管理器”窗口的右侧,单击“安装”按钮。
      6. “查看更改”窗口中,单击“确定”按钮。
      7. “许可验收”窗口中,单击“我接受”按钮。
    2. 实现AnonymousCredential类。这将会导致匿名认证问题。
      1. “解决方案资源管理器”窗口中,右键单击“libTools”项目,然后单击“添加” - > “类”上下文菜单项。
      2. “添加新项目”对话框中,在“名称”文本框中键入“AnonymousCredential.cs”,然后单击“确定”按钮
      3. 在新文件的顶部,添加以下语句:
        using Microsoft.Rest;
      4. 为此类使用以下代码。是的,没有什么需要,但继承。
        public class AnonymousCredential : ServiceClientCredentials
          {
          }
    3. 3)构建客户端Windows窗体来访问API
      1. “解决方案资源管理器”窗口中的“winClient”项目下,双击“Form1.cs”文件。
      2. “工具箱”窗口中,在表单中添加三个按钮。

根据以下内容更改按钮属性:

名称:cmdAllValues

文本:所有值

名称:cmdValue

文本:单值

名称:cmdUpdate

文本:更新

    1. 在Windows项目中,添加对'libTools'项目的引用
      1. “解决方案资源管理器”窗口中,右键单击“winClient”项目,单击“添加” - > “参考”上下文菜单项
      2. “参考管理器”窗口的左侧,选择“项目” - > “解决方案”
      3. “参考管理器”窗口的右侧,选中'libTools'以外的框,然后单击“确定”按钮
    2. 添加“所有值”按钮的代码
      1. 选择“Form1.cs(design)”页面
      2. 双击“所有值”按钮,这将为按钮创建一个点击事件。
      3. “Form1.cs”文件的顶部(由上一个任务已经打开),添加以下语句:
        using libTools;
          using svcRest;
      4. 更改以下代码的“cmdAllValues_Click”
                private async void cmdAllValues_Click(object sender, EventArgs e)
                  {
                      SvcRestClient client =
                          new SvcRestClient(new Uri("http://localhost/webDemo"),
                              new AnonymousCredential());
                      var result = client.Values.Get();
                  
                      foreach(var x in result)
                      {
                          MessageBox.Show(x);
                      }
                  }

        请注意以下细节:

        • 代理中有两种,同步和异步方法。代码说明了同步调用。
        • 大多数方法是扩展方法:因为这样,我们需要使用“使用svcRest”语句。
        • 您不需要处理调用API的协议详细信息。这是代理的优势。自.NET创建以来,我们对webservices有这个优势; 现在我们可以用这种方式使用web API。
    3. 添加“单值”按钮的代码
      1. 选择“Form1.cs(design)”页面
      2. 双击“单一值”按钮,这将为按钮创建一个点击事件。
      3. 更改以下代码的“cmdValue_Click”
                private async void cmdValue_Click(object sender, EventArgs e)
                  {
                      SvcRestClient client =
                          new SvcRestClient(new Uri("http://localhost/webDemo"),
                            new AnonymousCredential());
                      var result = client.Values.GetByid(1);
                      MessageBox.Show(result);
                  }
    4. 添加“更新”按钮的代码
      1. 选择“Form1.cs(design)”页面
      2. 双击“更新”按钮,这将为按钮创建一个点击事件。
      3. 更改以下代码的“cmdUpdate_Click”
                private async void cmdUpdate_Click(object sender, EventArgs e)
                  {
                      SvcRestClient client =
                          new SvcRestClient(new Uri("http://localhost/webDemo"),
                            new AnonymousCredential());
                      client.Values.PutByidvalue(1, "New Value");
                          
                      MessageBox.Show("Change Completed!");
                  }
    5. 执行并测试应用程序
      1. “解决方案资源管理器”窗口中,右键单击“winClient”项目,然后单击“设为启动项目”
      2. 单击工具箱中的“开始”按钮运行应用程序
      3. 点击“所有值”按钮,“单一值”按钮,“更新”按钮和“单一值”按钮,并在需要时单击“确定”按钮,以检查结果。API调用将运行良好。

Visual Studio 2017 and Swagger: Building and Documenting Web APIs的更多相关文章

  1. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试

    由于最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio编译OpenCV源代码并搭建开发环境,折腾了很长时间,查阅了很多相关资料,终于 ...

  2. Visual studio 2017编译 boost

    下载: https://www.boost.org/   或者 https://dl.bintray.com/boostorg/release/1.66.0/source/ 下载完成以后解压到自己想要 ...

  3. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  4. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  5. Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo

    目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...

  6. Create an offline installation of Visual Studio 2017 RC

    Create an offline installation of Visual Studio 2017 RC ‎2016‎年‎12‎月‎7‎日                             ...

  7. Visual Studio 2017 RC 初探安装

    上次看到博客介绍 Visual Studio 2017 RC,看到其中一个改进是启动很快,这是一大进步,也是低配电脑的程序员的期望.不过还没体验,是驴是骡子拉出来看看,这不就开始下载. 1.打开官网: ...

  8. .NET十五周年生日快乐 (3月7日发布Visual Studio 2017正式版?)

    今天 是.NET 对世界首次亮相15 周年.2002 年 2 月 13 日,第一版本的.NET 发布作为 Visual Studio.NET 的一部分.它仿佛就在昨天为微软建设成"下一代 W ...

  9. Visual Studio 2017 离线安装方式

    Visual Studio, 特别是Visual Studio 2017 通常是一个在线安装程序,如果你在安装过程中失去连接,你可以遇到问题.但是,由于法律原因,微软没有提供完整的可下载的ISO镜像. ...

随机推荐

  1. python内置的高效好用各种库

    二分查找,import bisect 堆排序,import heapq 哈希算法,import hashlib 压缩,lzma 图形处理,PIL 处理xml文件,PyXML 多媒体操作,PyMedia ...

  2. [Spark][Python][DataFrame][Write]DataFrame写入的例子

    [Spark][Python][DataFrame][Write]DataFrame写入的例子 $ hdfs dfs -cat people.json {"name":" ...

  3. 在vue2.0中引用element-ui组件库

    element-ui是由饿了么团队开发的一套基于 Vue 2.0 的桌面端组件库. 官网:http://element.eleme.io/ 安装 npm i element-ui -S 引用完整的el ...

  4. 04 Docker/基础设施 - DevOps之路

    04 Docker/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi Docker是一个开源的引擎,可 ...

  5. hibernate多对多 一对多 及简单入门 主键生成策略

    Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...

  6. pycharm 中 import requests 报错

    一 , 使用Pycharm来抓取网页的时候,要导入requests模块,但是在pycharm中 import requests 报错. 原因: python中还没有安装requests库 解决办法: ...

  7. c++学习之字符串拼接

    在这里,强调这样一个问题: 可以看出,c++中,定义了string类,string 类方便我们进行字符串的一些操作,而不是像C语言中采用字符数组的方式或者指针的方式,通过上面的一些描述,可以发现: s ...

  8. Elasticsearch 5.0Head插件

    Elasticsearch 5.0 —— Head插件部署指南   使用ES的基本都会使用过head,但是版本升级到5.0后,head插件就不好使了.下面就看看如何在5.0中启动Head插件吧! 官方 ...

  9. servlet总结:Servlet基础

    Servlet基础 1.手工编写第一个Servlet ⑴继承HttpServlet ⑵重写doGet()或者doPost()方法 ⑶在web.xml中注册Servlet 2.使用eclipse编写第一 ...

  10. VS2008引入头文件包含目录和lib库目录

    全局级别的引入 为VS所有项目设置包含目录和库目录,对所有项目都有效 如下图所示:工具-选项-项目和解决方案-VC++目录-包含文件:在此添加头文件目录即可 工具-选项-项目和解决方案-VC++目录- ...