根据@Guru Stron人的回复,我创建了自己的解决方案.因为答案不包括夸张的用户界面.确实提出了更多的问题,我会解决这些问题,但其中一半是与大摇大摆有关的.如果您不关心swagger,而只关心http响应,那么提供的答案@Guru Stron是非常好的.
我用来回答的控制器看起来像
using Microsoft.AspNetCore.Mvc;
using System.Numerics;
namespace DfxBackendService.Controllers
{
[ApiController]
[Route("api/[controller]/[action]")]
public class StagingController : ControllerBase
{
private readonly ILogger<StagingController> _logger;
public StagingController(ILogger<StagingController> logger)
{
_logger = logger;
}
[HttpGet]
public BigInteger GetGmxSupply()
{
return BigInteger.Parse("9474488248131986559259619");
}
[HttpPost]
public bool PostGmxSupply(BigInteger value)
{
return value == BigInteger.Parse("9474488248131986559259619");
}
}
}
出于好奇,我编写了包含Read函数的有效实现的转换器.
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace DfxBackendService.JsonConverter
{
public class BigIntegerConverter : JsonConverter<BigInteger>
{
public override BigInteger Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> BigInteger.Parse(reader.GetString()!, NumberStyles.Integer, NumberFormatInfo.InvariantInfo);
public override void Write(Utf8JsonWriter writer, BigInteger value, JsonSerializerOptions options)
=> writer.WriteRawValue(value.ToString(NumberFormatInfo.InvariantInfo));
public override bool CanConvert(Type typeToConvert)
=> typeof(BigInteger).IsAssignableFrom(typeToConvert);
}
}
为了使用我添加的转换器,
builder.Services.Configure<JsonOptions>(options =>
{
options.JsonSerializerOptions.Converters.Add(new BigIntegerConverter());
});
进入Program.cs.因为我不使用最小的API,这是唯一需要的.
从这里开始,http响应是正确的,正如预期的那样.
然而,确实有几件事冒了出来.
与转换器相关的问题是,当调用POST方法BigIntegerConverter
时不使用.例如,在浏览器中使用https://localhost:7140/api/Staging/PostGmxSupply?value=9474488248131986559259619
或使用SWAGGER UI.读函数没有被调用,相反,我直接在控制器的PostGmxSupply
函数中结束.该值被正确解析,对于给定的示例,结果为true
.所以这不是什么大问题,我只是想知道为什么.为了解决这个问题,我还在转换器中添加了CanConvert
功能,但没有任何效果.
但是我遇到了两个与swagger有关的问题.
先说简单的.Biggram并没有被呈现为数字,而是被呈现为对象.
所以我把第builder.Services.AddSwaggerGen();
行改成了
builder.Services.AddSwaggerGen(options =>
{
options.MapType<BigInteger>(() => new Microsoft.OpenApi.Models.OpenApiSchema { Type = "integer" });
});
然后正确显示swagger.json中的模式数据.
第二个问题是我没有找到解决方案的东西.Savagger用户界面将给定的数字转换为科学格式.因此,Savagger用户界面显示的不是9474488248131986559259619
,而是9.474488248131986e+24
,而我没有找到解决这个问题的方法.