“Refit 中无法将 JSON 值转换为 Enum

问题描述 投票:0回答:3

我有一个 .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 序列化器配置错误。

asp.net-core .net-core refit
3个回答
21
投票

您需要在您的

startup.cs
中设置此配置吗?

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddControllers().AddJsonOptions(opt =>
     {
         opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
     });
 }

0
投票

您必须从序列化器设置中删除 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)

这对我有帮助。 https://github.com/reactiveui/refit/issues/1526


-1
投票

为 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);

我想这会解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.