OpenApi 3.1 и AddOpenApi в приложении ASP.NET Core Int32 и StringC#

Место общения программистов C#
Ответить
Anonymous
 OpenApi 3.1 и AddOpenApi в приложении ASP.NET Core 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 там, где есть необходимость в int?, или Kiota за жалобу на то, что конструкция string|int не может быть int на уровне кода?
Я понимаю, что я, вероятно, мог бы отправить запрос GetProductionOrdersForOrderNumber?orderNumber=Stupid, но не должен ли он обрабатываться каким-то другим способом место?
Кто здесь не прав?

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

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

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

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

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

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