我有一个 .Net Core Razor 页面应用程序,它尝试使用使用 Refit 创建的类库调用 .Net Core API。
我创建了一个 Refit API 接口,该接口使用以枚举作为属性类型之一的模型。
这是API端的接口片段:
IPaymentAPI
接口
[Post("/recharge")]
Task<string> Recharge([Body] RechargeRequest request);
这是请求模型:该模型包含一个简单的枚举
ELicenseType
。
public class RechargeRequest
{
public ELicenseType LicenseType{ get; set; }
}
电子许可证类型:
public enum ELicenseType
{
NotSpecified = 0,
Standard = 1,
Commercial = 2
}
控制器中的API实现:
[HttpPost("recharge")]
public async Task<IActionResult> Recharge(
[FromBody] RechargeRequest request)
{
Recharge result = await _mediator.Send(_mapper.Map<RechargeCommand>(request));
return Ok();
}
调用此 Recharge 方法时,Refit 会抛出 ValidationApiException:
ValidationApiException: Response status code does not indicate success: 400 (Bad Request).
内容是:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-f9178d81421bca438241dd2def43d065-edbd7f210919b24e-00",
"errors": {
"$.licenseType": [
"The JSON value could not be converted to ELicenseType. Path: $.licenseType | LineNumber: 0 | BytePositionInLine: 98."
]
}
}
Refit 库似乎不支持请求中的 Enums,或者我的 JSON 序列化器配置错误。
您需要在您的
startup.cs
中设置此配置吗?
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(opt =>
{
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}
您必须从序列化器设置中删除 Enum
JsonStringEnumConverter
:
var serializer = SystemTextJsonContentSerializer.GetDefaultJsonSerializerOptions();
serializer.Converters.Remove(serializer.Converters.Single(x => x.GetType().Equals(typeof(JsonStringEnumConverter))));
var refitSettings = new RefitSettings
{
ContentSerializer = new SystemTextJsonContentSerializer(serializer)
};
services.AddRefitClient<T>(refitSettings)
为 API 接口创建 Refit 实现时,您可以提供 RefitSettings 的实例。
var refitSettings = new RefitSettings
{
ContentSerializer = new SystemTextJsonContentSerializer(new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
NumberHandling = JsonNumberHandling.AllowReadingFromString,
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
})
};
var api = RestService.For<IMyApi>(client, refitSettings);
我想这会解决你的问题。