Asp.net-Web-Api

Swashbuckle (Swagger) 中的預設模型範例

  • March 7, 2015

我正在執行 ASP WebAPI 2 並成功安裝了 Swashbuckle。我試圖弄清楚如何定義預設模式值是什麼?

例如,在 Swagger 現場展示網站上,他們將 pet 的預設值更改為“doggie”。他們還定義了狀態的允許值。(現場展示

範例 1 範例 2

好吧,vgaspar.trivix 的程式碼對我來說並沒有完全工作,沒有為模式設置預設值。我也有一個NullPointerException. 我設法通過編輯Apply方法使其按預期工作並像這樣操作 schemaRegistry:

public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
   if (operation.parameters == null)
       return;
   IDictionary<string, object> parameterValuePairs =
   GetParameterValuePairs(apiDescription.ActionDescriptor);

   foreach (var param in operation.parameters)
   {
       if (param.schema != null && param.schema.@ref != null)
       {
           string schemaName = param.schema.@ref.Split('/').LastOrDefault();
           if (schemaRegistry.Definitions.ContainsKey(schemaName))
               foreach (var props in schemaRegistry.Definitions[schemaName].properties)
               {
                   if (parameterValuePairs.ContainsKey(props.Key))
                       props.Value.@default = parameterValuePairs[props.Key];
               }
       }
       var parameterValuePair = parameterValuePairs.FirstOrDefault(p => p.Key.IndexOf(param.name, StringComparison.InvariantCultureIgnoreCase) >= 0);
       param.@default = parameterValuePair.Value;
   }
}

我設法通過遵循此連結上的內容來完成這項工作:

<https://github.com/domaindrivendev/Swashbuckle/issues/69#issuecomment-53953785>

簡而言之,這是需要做的:

  1. 如鍊接中所述,創建類 SwaggerDefaultValue 和 AddDefaultValues。我做的一些改變:
public class SwaggerDefaultValue : Attribute
{
   public string Name { get; set; }
   public string Value { get; set; }

   public SwaggerDefaultValue(string value)
   {
       this.Value = value;
   }

   public SwaggerDefaultValue(string name, string value) : this(value)
   {
       this.Name = name;
   }
}

public class AddDefaultValues : IOperationFilter
{
   public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
   {
       IDictionary&lt;string, object&gt; parameterValuePairs =
       GetParameterValuePairs(apiDescription.ActionDescriptor);

       foreach (var param in operation.parameters)
       {
           var parameterValuePair = parameterValuePairs.FirstOrDefault(p =&gt; p.Key.IndexOf(param.name, StringComparison.InvariantCultureIgnoreCase) &gt;= 0);
           param.@default = parameterValuePair.Value;
       }
   }

   private IDictionary&lt;string, object&gt; GetParameterValuePairs(HttpActionDescriptor actionDescriptor)
   {
       IDictionary&lt;string, object&gt; parameterValuePairs = new Dictionary&lt;string, object&gt;();

       foreach (SwaggerDefaultValue defaultValue in actionDescriptor.GetCustomAttributes&lt;SwaggerDefaultValue&gt;())
       {
           parameterValuePairs.Add(defaultValue.Name, defaultValue.Value);
       }

       foreach (var parameter in actionDescriptor.GetParameters())
       {
           if (!parameter.ParameterType.IsPrimitive)
           {
               foreach (PropertyInfo property in parameter.ParameterType.GetProperties())
               {
                   var defaultValue = GetDefaultValue(property);

                   if (defaultValue != null)
                   {
                        parameterValuePairs.Add(property.Name, defaultValue);
                   }
               }
           }
       }

       return parameterValuePairs;
   }

   private static object GetDefaultValue(PropertyInfo property)
   {
       var customAttribute = property.GetCustomAttributes&lt;SwaggerDefaultValue&gt;().FirstOrDefault();

       if (customAttribute != null)
       {
           return customAttribute.Value;
       }

       return null;
   }
}
  1. 編輯您的 SwaggerConfig 並將 AddDefaultValues 類添加到 OperationFilters:
GlobalConfiguration.Configuration
    .EnableSwagger(c =&gt; {
          ...
          c.OperationFilter&lt;AddDefaultValues&gt;()
          ...
     });
 現在對於我想要預設值的參數,我只需添加以下內容:
blic IHttpActionResult Put([FromBody]Pet pet)
.
turn Ok();

blic class Pet {
waggerDefaultValue("doggie")]
blic string Name { get; set; }

waggerDefaultValue("available")]
blic string Status;

.

引用自:https://stackoverflow.com/questions/28911023