OpenApi 3.1 и AddOpenApi в приложении AspNetCore Int32 и StringC#

Место общения программистов C#
Ответить
Anonymous
 OpenApi 3.1 и AddOpenApi в приложении AspNetCore Int32 и String

Сообщение Anonymous »

Ну, я здесь несколько застрял и не знаю, какая сторона делает то, чего не должна делать. Сначала я попытаюсь обрисовать проблему.
У меня есть вызов API, который определяется следующим образом:

Код: Выделить всё

[HttpGet("GetProductionOrdersForOrderNumber")]
public List GetProductionOrdersForOrderNumber(int orderNumber, int? pos1, int? pos2)
{
...
}
Он имеет четыре параметра, первый из которых является обязательным.
В моем Program.cs я настраиваю создание/публикацию схемы следующим образом:

Код: Выделить всё

builder.Services.AddOpenApi(options =>
{
TypeTransformer.MapType(new OpenApiSchema { Type = JsonSchemaType.Number, Format = "decimal" });
TypeTransformer.MapType(new OpenApiSchema { Type = JsonSchemaType.Number | JsonSchemaType.Null, Format = "decimal" });
TypeTransformer.MapType(new OpenApiSchema {Type = JsonSchemaType.Integer | JsonSchemaType.Null, Format = "int32"});

options.AddSchemaTransformer(TypeTransformer.TransformAsync);
});
Обратите внимание, что я явно не указываю MapType для типа int, не допускающего значения NULL. Созданная схема выглядит следующим образом:

Код: Выделить всё

"/api/ProductionStateViewer/GetProductionOrdersForOrderNumber": {
"get": {
"tags": [
"ProductionStateViewer"
],
"parameters": [
{
"name": "orderNumber",
"in": "query",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "pos1",
"in": "query",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"null",
"integer"
],
"format": "int32"
}
},
{
"name": "pos2",
"in": "query",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"null",
"integer"
],
"format": "int32"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/plain": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ErpOrder"
}
}
},
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ErpOrder"
}
}
},
"text/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ErpOrder"
}
}
}
}
}
}
}
},
Обратите внимание, что параметр orderNumber генерируется как целое число или строка с указанным форматом int32. Я понимаю, что этого можно ожидать, потому что где-то читал, что это часть запроса, которая передается в виде строки. Тем не менее, с этим аргументом, по сути, каждый параметр в запросе представляет собой строку, что делает тип нерелевантным.
Размышляя о том, как это может работать, я попытался создать клиент с помощью Kiota. Для этого я использовал следующую команду:

Код: Выделить всё

kiota generate --openapi http://localhost:1037/openapi/v1.json --language CSharp --class-name ErpInterfaceService --namespace-name ErpInterfaceServiceRest --output d:\temp\kiota-test
Kiota теперь выдаст следующее предупреждение:

Код: Выделить всё

OpenAPI warning: #/paths/~1api~1ProductionStateViewer~1GetProductionOrdersForOrderNumber/get/parameters/0/schema - The format int32 is not supported by Kiota for the type Integer, String and the string type will be used.
Конечно, сгенерированный вызов API в C# теперь будет иметь параметр orderNumber в виде строки?, что противоположно тому, что я хочу. Остальные параметры корректно генерируются как int?.
Конечно, я мог бы добавить строку

Код: Выделить всё

TypeTransformer.MapType(new OpenApiSchema {Type = JsonSchemaType.Integer, Format = "int32"});
к моей инициализации, которая заставляет .AddOpenApi создавать тип int (аналогично типам int, допускающим значение NULL, с другими параметрами), а Kiota ведет себя так, как ожидалось, но я хотел бы понять, каков на самом деле «правильный» способ сделать это? Кто здесь не прав. AddOpenApi, чтобы не создавать int там, где он необходим? Киоте за жалобу на то, что конструкция string|int не может быть целым числом на уровне кода? Я понимаю, что, возможно, я мог бы отправить запрос GetProductionOrdersForOrderNumber?orderNumber=Stupid, но разве это не должно быть обработано в другом месте?
Кто здесь не прав?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -vs-string
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»