Как пометить строки как необнуляемые в asp.net core 3.0 swagger - PullRequest
1 голос
/ 09 октября 2019

Я использую asp.net core 3 и swashbuckle с конфигурацией по умолчанию, и у меня есть параметр dto со строкой, которую я хочу не обнулять. Как мне этого добиться? Обратите внимание, Обязательные и обнуляемость являются отдельными проблемами в swagger.

Он также использует C # 8 и не допускает обнуления, поэтому компилятор должен уже пометить свойство как не обнуляемое. Понятно, что Swashbuckle не был обновлен для учета этого (и, возможно, не может), но я хотел бы иметь возможность каким-то образом переопределить сгенерированные метаданные.

class MyDto {
    [Required]
    // I want this to show as non-nullable in the swagger documentation (and ideally also be non-nullable in the binding)
    public string TestProp { get; set; }
}

[HttpPost]
public void Post([FromBody] MyDto requestModel) {
}

Я попытался сделать это Обязательным,Я также попытался добавить аннотации newtonsoft, но, похоже, ни одна из них этого не сделала.

Соответствующий бит генерируемого документа:

    "MyDto": {
      "required": [
        "testProp"
      ],
      "type": "object",
      "properties": {
        "testProp": {
          "type": "string",
          "nullable": true
        }
      },
      "additionalProperties": false
     }

Обратите внимание, что строковый параметр имеет непосредственное значениеПараметр не генерирует атрибут NULL. Например,

[HttpPost("testPost")]
public void Post([FromBody] [Required] string testProp) {
}

будет генерировать

"/api/test/testPost": {
  "post": {
    "tags": [
      "Test"
    ],
    "requestBody": {
      "content": {
        "application/json": {
          "schema": {
            "type": "string"
          }
        },
        "text/json": {
          "schema": {
            "type": "string"
          }
        },
        "application/*+json": {
          "schema": {
            "type": "string"
          }
        }
      },
      "required": true
    },
    "responses": {
      "200": {
        "description": "Success"
      }
    }
  }
},

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

До версии 4.01 nullable:true было отправлено для необязательных строк. Это сломалось в первых версиях 5.0 RC, и nullable:true вообще не генерировался для дополнительных строк. Это, очевидно, неправильно.

Начиная с 5.0 RC3 дополнительные строки обнуляются еще раз.

Чтобы указать, что необязательная строка не обнуляема, необходимо добавить [JsonProperty(Required = Required.DisallowNull)] к свойству. Копирование из одного из модульных тестов Swashbuckle , это:

    [JsonProperty(Required = Required.DisallowNull)]
    public string StringWithRequiredDisallowNull { get; set; }

Должен установить флаг Nullable свойства :

Assert.False(schema.Properties["StringWithRequiredDisallowNull"].Nullable);

And emit nullable:true.

0 голосов
/ 09 октября 2019

прочитайте документацию для RequiredAttribute:

Указывает, что требуется значение поля данных.

...