সোয়াশবাকল ব্যবহার করে কীভাবে ওয়েবএপিআই-তে সোয়াগার ডকুমেন্টেশন থেকে পদ্ধতি বাদ দেওয়া যায়


135

আমি সহ API ডকুমেন্টেশন স্বয়ংক্রিয়ভাবে ব্যবহার করা হচ্ছে একটি C # এর ASP.NET WebAPI আবেদন করা হবে Swashbuckle । আমি ডকুমেন্টেশন থেকে কিছু পদ্ধতি বাদ দিতে সক্ষম হতে চাই তবে সোয়াগারকে সোয়াগার ইউআই আউটপুটে অন্তর্ভুক্ত না করতে কীভাবে বলতে হবে তা আমি কার্যকর করতে পারি না।

আমি বুঝতে পারি এটি একটি মডেল বা স্কিমা ফিল্টার যুক্ত করার সাথে করণীয় তবে এটি কী করা উচিত তা স্পষ্ট নয় এবং ডকুমেন্টেশনটি কেবল কোনও পদ্ধতির জন্য আউটপুটকে কীভাবে পরিবর্তন করতে হবে তার উদাহরণ প্রদান করে, আউটপুট থেকে সম্পূর্ণ অপসারণ না করে।

আগাম ধন্যবাদ.

উত্তর:


337

উত্পাদিত ডকুমেন্টেশন থেকে এগুলি বাদ দিতে আপনি নিয়ামক এবং ক্রিয়াকলাপগুলিতে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করতে পারেন: [ApiExplorerSettings(IgnoreApi = true)]


12
দুর্দান্ত কাজ করেছেন, এর উত্তরটি হওয়া উচিত
জনসি 24'18

4
প্রোগ্রামযুক্তভাবে এটি করার কোনও উপায় আছে কি? আমি একটি কনফিগারেশন সেটিংস অনুযায়ী কিছু পরিবেশে একটি API প্রকাশ করতে চাই তবে অন্যগুলিতে নয়।
পল কেইনিজ

নিবন্ধন করুন হতে পারে [জসনআইগনোর]?
মাইকসিগ 20

@ এমাইকসিজ হ্যাঁ [জসনআইগনোর] কাজ করে। দুর্ভাগ্যক্রমে, এটি সিরিয়ালাইজেশন নিষিদ্ধ করে।
সায়ফুল নিজাম ইয়াহিয়া

4
সোয়াশবাকল ডকুমেন্টেশন: স্বেচ্ছাসেবক অপারেশনগুলি
ছাড়ুন

17

কেউ গিথুব এ সমাধান পোস্ট করেছেন তাই আমি এটি এখানে পেস্ট করতে চলেছি। সমস্ত কৃতিত্ব তাঁর কাছে যায়। https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

প্রথমে একটি অ্যাট্রিবিউট ক্লাস তৈরি করুন

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute : Attribute
{
}

তারপরে একটি ডকুমেন্ট ফিল্টার ক্লাস তৈরি করুন

public class HideInDocsFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        foreach (var apiDescription in apiExplorer.ApiDescriptions)
        {
            if (!apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any() && !apiDescription.ActionDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any()) continue;
            var route = "/" + apiDescription.Route.RouteTemplate.TrimEnd('/');
            swaggerDoc.paths.Remove(route);
        }
    }
}

তারপরে সোয়াগার কনফিগার ক্লাসে সেই ডকুমেন্ট ফিল্টারটি যুক্ত করুন

public class SwaggerConfig
{
    public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        config
             .EnableSwagger(c =>
                {
                    ...                       
                    c.DocumentFilter<HideInDocsFilter>();
                    ...
                })
            .EnableSwaggerUi(c =>
                {
                    ...
                });
    }
}

শেষ পদক্ষেপটি হ'ল হাইডআইনডোকস অ্যাট্রিবিউট] আপনি যে নিয়ামক তৈরি করতে চান না তা নিয়ন্ত্রক বা পদ্ধতিতে বৈশিষ্ট্য যুক্ত করুন ash


1
আমি মনে করি সরানরউটটি যে ড্রয়েড আমি সন্ধান করছি তা হতে পারে।
পল কেইনিজ

13

কোনও নথি ফিল্টার তৈরি হওয়ার পরে আপনি সোয়াগার নথি থেকে "অপারেশনস" সরিয়ে ফেলতে পারেন - ক্রিয়াটি সেট করুন null(যদিও এটি করার অন্যান্য উপায়ও থাকতে পারে)

নিম্নলিখিত নমুনা কেবল GETক্রিয়াগুলি অনুমতি দেয় - এবং এই সমস্যাটি থেকে নেওয়া হয়েছে ।

class RemoveVerbsFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        foreach (PathItem path in swaggerDoc.paths.Values)
        {
            path.delete = null;
            //path.get = null; // leaving GET in
            path.head = null;
            path.options = null;
            path.patch = null;
            path.post = null;
            path.put = null;
        }
    }
}

এবং আপনার সোয়াগার কনফিগারেশনে:

...EnableSwagger(conf => 
{
    // ...

    conf.DocumentFilter<RemoveVerbsFilter>();
});

1
মনে রাখবেন: এটি কোনও অসুবিধা না থাকলেও এই পথটি সরিয়ে ফেলবে না path.get = null;- ফলস্বরূপ সেই পথগুলি এখনও সোয়াগার ফাইলে অন্তর্ভুক্ত করা হবে তবে কেবল বিশদ ছাড়াই। ApiExplorerSettingsAttributeআপনি গিটহাবে আপনার মূল জবাবটিতে যেমন উল্লেখ করেছেন তেমন আপনার উত্তরে অন্তর্ভুক্ত করা ভাল । এপিআই এক্সপ্লোরারসেটিংস ব্যবহার করে সোয়াগার ফাইলের schemesতালিকায় টাইপ তথ্য যুক্ত হওয়া থেকে বিরত থাকতে পারে ।
JBert

7

আমি পথ আইটেমগুলির জন্য অভিধানের প্রবেশপত্রগুলি সম্পূর্ণরূপে সরিয়ে দিতে পছন্দ করব:

var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => !pathItem.Key.Contains("api/"))
                .ToList();

foreach (var item in pathsToRemove)
{
    swaggerDoc.Paths.Remove(item.Key);
}

এই পদ্ধতির সাথে, আপনি উত্পন্ন swagger.json সংজ্ঞাটিতে "খালি" আইটেমগুলি পাবেন না।


3

একটি ফিল্টার তৈরি করুন

public class SwaggerTagFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        foreach(var contextApiDescription in context.ApiDescriptions)
        {
            var actionDescriptor = (ControllerActionDescriptor)contextApiDescription.ActionDescriptor;

    if(!actionDescriptor.ControllerTypeInfo.GetCustomAttributes<SwaggerTagAttribute>().Any() && 
    !actionDescriptor.MethodInfo.GetCustomAttributes<SwaggerTagAttribute>().Any())
            {
                var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
            swaggerDoc.Paths.Remove(key);
            }
        }
    }
}

একটি বৈশিষ্ট্য তৈরি করুন

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SwaggerTagAttribute : Attribute
{
}

Startup.cs এ প্রয়োগ করুন

 services.AddSwaggerGen(c => {
            c.SwaggerDoc(1,
                new Info { Title = "API_NAME", Version = "API_VERSION" });
            c.DocumentFilter<SwaggerTagFilter>(); // [SwaggerTag]
        });

আপনি সোয়াগার জেএসএনে অন্তর্ভুক্ত করতে চান এমন পদ্ধতি এবং নিয়ন্ত্রণকারীগুলিতে [স্ব্যাগারটাগ] বৈশিষ্ট্য যুক্ত করুন


মিষ্টি। উপযুক্ত পন্থা এবং স্লেন ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ।
বেদরান মান্ডিć

2

কাউকে সহায়তা করতে পারে তবে বিকাশের সময় (ডিবাগিং) আমরা পুরো কন্ট্রোলার এবং / অথবা ক্রিয়াগুলি প্রকাশ করতে এবং তারপরে এগুলি লুকিয়ে রাখতে চাই (রিলিজ বিল্ড)

#if DEBUG
    [ApiExplorerSettings(IgnoreApi = false)]
#else
    [ApiExplorerSettings(IgnoreApi = true)]
#endif  

1

@ স্পটেডমাহেন্স উত্তরের উপর ভিত্তি করে । আমার কাজটি বিপরীত ছিল। মঞ্জুরিপ্রাপ্তদের কেবল এটিই দেখান।

ফ্রেমওয়ার্ক:। নেটকোর 2.1; সোয়াগার: 3.0.0

বৈশিষ্ট্য যুক্ত করা হয়েছে

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class ShowInSwaggerAttribute : Attribute
{
}

এবং কাস্টম আইডোকামেন্টফিল্টার বাস্তবায়ন করুন

public class ShowInSwaggerFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {

        foreach (var contextApiDescription in context.ApiDescriptions)
        {
            var actionDescriptor = (ControllerActionDescriptor) contextApiDescription.ActionDescriptor;

            if (actionDescriptor.ControllerTypeInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any() ||
                actionDescriptor.MethodInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any())
            {
                continue;
            }
            else
            {
                var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
                var pathItem = swaggerDoc.Paths[key];
                if(pathItem == null)
                    continue;

                switch (contextApiDescription.HttpMethod.ToUpper())
                {
                    case "GET":
                        pathItem.Get = null;
                        break;
                    case "POST":
                        pathItem.Post = null;
                        break;
                    case "PUT":
                        pathItem.Put = null;
                        break;
                    case "DELETE":
                        pathItem.Delete = null;
                        break;
                }

                if (pathItem.Get == null  // ignore other methods
                    && pathItem.Post == null 
                    && pathItem.Put == null 
                    && pathItem.Delete == null)
                    swaggerDoc.Paths.Remove(key);
            }
        }
    }
}

সার্ভিসেস কোড কনফিগার করুন :

public void ConfigureServices(IServiceCollection services)
{
     // other code

    services.AddSwaggerGen(c =>
    {
        // other configurations
        c.DocumentFilter<ShowInSwaggerFilter>();
    });
}

ধন্যবাদ আলেহাকে। এই অ্যাপ্রোচটি আসলে সোয়াশবাকল.অডাটা জন্য ভাল কাজ করে যেখানে অ্যাপি এক্সপ্লোরারসেটেটিংঅ্যাট্রিবিউট কাজ করে না।
প্রসাদ কোরহলে

1

একটি লাইন SwaggerConfig c.DocamentFilter () যুক্ত করুন;

public class HideInDocsFilter : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        { 
var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => !pathItem.Key.Contains("api/"))
                .ToList();

foreach (var item in pathsToRemove)
{
    swaggerDoc.Paths.Remove(item.Key);
}
    }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.