zoukankan      html  css  js  c++  java
  • 在Sitecore8.2解决方案中使用Swagger作为API管理工具

    假设您的Sitecore解决方案需要一些API服务。显而易见的是使用.net Web API实现它们。有时,在构建消费应用程序时,理解API的各种方法对开发人员来说可能是一项挑战。

    假设您的Sitecore解决方案需要一些API服务。显而易见的是使用.net Web API实现它们。有时,在构建消费应用程序时,理解API的各种方法对开发人员来说可能是一项挑战。Swagger  是RESTful API的机器可读表示, 支持交互式文档,客户端SDK生成和可发现性。

    使用Swagger

    使用Swagger为Web API生成良好的文档和帮助页面就像添加NuGet包一样简单。

    只要Sitecore仍然是一个asp.net应用程序,我们就可以使用Swagger!所以我实现了一个Web API控制器,我希望在我的Sitecore实例中托管它并以某种方式记录它:

    1
    2
    3
    4
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    namespace Feature.WebApi.Controllers
    {
        using System.Web.Http;
     
        [RoutePrefix("-/api/v1")]
        public class MyServicesApiController : ApiController
        {
            [HttpGet]
            [Route("hello-world")]
            public IHttpActionResult HelloWorld()
            {
                return this.Ok("Hello world");
            }
        }
    }

    好的,这是我的“hello world”API方法。现在我将使用nuget将Swagger安装到我的Feature.Swagger项目中:

    1
    install-package Swashbuckle

    默认的nuget包将在/App_Start/SwaggerConfig.cs中创建启动配置。默认情况下,它使用WebActivator扩展将其绑定到应用程序启动,以便在初始化Web应用程序时执行配置。

    默认情况下,它不能与Sitecore平稳运行,但我们可以使用少量配置使其正常工作。Swagger UI的入口点是{your.domain.com} / swagger我跑了,看下一张图:

    招摇,ERROR1

    为了解决它,我们需要修改/App_Start/SwaggerConfig.cs并取消注释下一行:

    1
    c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

    再次运行 - 我们看到下一个问题:

    招摇-错误模式冲突

    这次我们需要取消注释另一行配置:

    1
    c.UseFullTypeNameInSchemaIds();

    好的,现在它已启动并运行,但是底部有一个annoing错误,表示存在架构验证错误。Swagger UI仍然有效,但我们真的不想看到任何错误消息吗?我们可以通过取消另外一行配置来绕过它:

    1
    c.DisableValidator();

    招摇的服务混合

    Web API服务

    现在它查找并运行,我甚至能够找到我的服务方法。但是,Sitecore有很多自己使用的Web API服务,很难找到我自己的服务。将Sitecore本机Web API控制器与我的分离是很好的。它支持API版本控制,从我的角度来看,这是我们如何分离它的方法之一。我们可以向SwaggerConfig添加一个方法,该方法将声明API的版本。

    我将Sitecore服务称为版本“ sc ”,将我自己称为“ my_services ”:

    1
    2
    3
    4
    6
    private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
    {
        if (apiDesc.Route.RouteTemplate.StartsWith("-/api/v1") && targetApiVersion == "my_services") return true;
        if (apiDesc.Route.RouteTemplate.StartsWith("sitecore") && targetApiVersion == "sc") return true;
        return false;
    }

    在配置中,我们需要注释/删除此行

    1
    c.SingleApiVersion("v1", "Feature.Swagger");

    并添加这个:

    1
    2
    3
    4
    6
    7
    c.MultipleApiVersions(
        ResolveVersionSupportByRouteConstraint,
        vc =>
        {
            vc.Version("my_services", "My services API (you can switch to Sitecore API /swagger/docs/sc)");
            vc.Version("sc", "Sitecore services (you can switch to My services API /swagger/docs/my_services)");
        });

    现在我们为Sitecore API和My API提供了2个独立的视图。它们被Swagger UI视为API版本:

    招摇,我的服务

    招摇,Sitecore的服务

    安装

    或许,公开提供该文档并不是一个好主意,因为它会产生安全问题。因此,我们需要做的是在登录后隐藏Swagger UI,并使其仅供Sitecore管理员用户使用。我们可以重新使用Sitecore的默认登录页面。从我的角度来看,最好的方法是使用HTTP MessageHandlers。我们可以实现下一个消息处理器

    1
    2
    3
    4
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    三十
    31
    32
    33
    34
    35
    36
    37
    namespace Feature.Swagger
    {
        using System;
        using System.Net;
        using System.Net.Http;
        using System.Threading;
        using System.Threading.Tasks;
        using Sitecore;
     
        public class SwaggerSitecoreAuthMessageHandler : DelegatingHandler
        {
            protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                var isAuthenticated = Context.User?.IsAuthenticated ?? false;
                var isAdministrator = Context.User?.IsAdministrator ?? false;
     
                if (this.IsSwaggerRequest(request) && (!isAuthenticated || !isAdministrator))
                {
                    var response = new HttpResponseMessage(HttpStatusCode.Redirect);
                    var uri = request.RequestUri;
                    var currentOrigin = uri.AbsoluteUri.Replace(uri.PathAndQuery, string.Empty);
                    var logiPage = currentOrigin + @"/sitecore/login?returnurl=/swagger";
                    response.Headers.Location = new Uri(logiPage);
                    return Task.FromResult(response);
                }
                else
                {
                    return base.SendAsync(request, cancellationToken);
                }
            }
     
            private bool IsSwaggerRequest(HttpRequestMessage request)
            {
                return request.RequestUri.PathAndQuery.ToLowerInvariant().StartsWith("/swagger");
            }
        }
    }

    然后在SwaggerConfig类中添加一行,如下所示:

    1
    GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerSitecoreAuthMessageHandler());

    现在我们已成功将Swagger安装到Sitecore解决方案中。但是,正如我之前提到的,它使用WebActivator扩展,这更像是Web解决方案的反模式,我最好摆脱它,以保持螺旋原则。相反,我们可以使其更多Sitecore本地方式 - 在Sitecore初始化管道上运行配置。

    所以首先我们要做的是删除这一行:

    1
    [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

    然后创建一个运行初始化的超简单初始化管道处理器:

    1
    2
    3
    4
    6
    7
    8
    9
    10
    11
    12
    namespace Feature.Swagger.Pipelines.Initialize
    {
        using Sitecore.Pipelines;
     
        public class InitializeSwagger
        {
            public void Process(PipelineArgs args)
            {
                SwaggerConfig.Register();
            }
        }
    }

    当然我们需要将它添加到配置文件/App_Config/Include/Feature/Feature.Swagger.config中

    1
    2
    3
    4
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8" ?>
     
    <sitecore>
    <pipelines>
    <initialize>
    <processor type="Feature.Swagger.Pipelines.Initialize.InitializeSwagger, Feature.Swagger" />
    </initialize>
    </pipelines>
    </sitecore>
    </configuration>

    最后,我的完整SwaggerConfig.cs文件如下所示:

    1
    2
    3
    4
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    三十
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    namespace Feature.Swagger
    {
        using System.Web.Http;
        using System.Linq;
        using Swashbuckle.Application;
        using System.Web.Http.Description;
     
        public class SwaggerConfig
        {
            public static void Register()
            {
                var thisAssembly = typeof(SwaggerConfig).Assembly;
     
                GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerSitecoreAuthMessageHandler());
     
                GlobalConfiguration.Configuration
                    .EnableSwagger(c =>
                        {
                            c.MultipleApiVersions(
                                ResolveVersionSupportByRouteConstraint,
                                vc =>
                                {
                                    vc.Version("my_services", "My services API (you can switch to Sitecore API /swagger/docs/sc)");
                                    vc.Version("sc", "Sitecore services (you can switch to My services API /swagger/docs/my_services)");
                                });
     
                            c.UseFullTypeNameInSchemaIds();
     
                            c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
                        })
                    .EnableSwaggerUi(c =>
                        {
                            c.DisableValidator();
                        });
            }
     
            private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
            {
                if (apiDesc.Route.RouteTemplate.StartsWith("-/api/v1") && targetApiVersion == "my_services") return true;
                if (apiDesc.Route.RouteTemplate.StartsWith("sitecore") && targetApiVersion == "sc") return true;
                return false;
            }
        }
    }

    就是这个。它与我们的Sitecore解决方案集成在一起。在他们的网站https://swagger.io上阅读有关所有Swagger功能的更多信息

    我一直在使用Swagger和Sitecore 8.x以及Sitecore 9版本,一切正常!在这里查看我们的GitHub回购

  • 相关阅读:
    远程监控基础知识和故障排除
    感慨颇多
    物联网操作系统Hello China移植mile stone之一:移植基础版本V1.76发布
    iOS5系统API和5个开源库的JSON解析速度测试
    (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0)
    [工具]Mac平台开发几个网络抓包工具(sniffer)
    [工具]Mac下非常好用的快捷终端Dterm
    【IOS】在SDK中打开其他接入应用的解决方案
    [开源]在iOS上实现Android风格的控件Toast
    [技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档
  • 原文地址:https://www.cnblogs.com/BlogNetSpace/p/10813412.html
Copyright © 2011-2022 走看看