带有枚举输入参数的Web Api post方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有枚举输入参数的Web Api post方法相关的知识,希望对你有一定的参考价值。

在尝试调用以枚举作为输入参数的Web API方法时,为什么会在下面的屏幕截图中看到错误?我该如何解决这个问题?

无论我做什么,似乎messageDestinationType总是无效的......

我宁愿将输入类型保留为枚举。我很擅长使用web apis,当WCF完美地处理这个场景时,我无法理解这是多么困难

[JsonConverter(typeof(StringEnumConverter))]    
public enum MessageDestinationType
{
    None = 0,
    [EnumMember(Value = "SMS")]
    SMS = 1,
    [EnumMember(Value = "Email")]
    Email = 2,
    PushNotification = 3,
    UXP = 4,
    IntermediaryApp = 5,
    YouthApp = 6
}



    [HttpPost, Route("ReadClientMessagesC")]
    public IHttpActionResult ReadClientMessagesC([FromBody]MessageDestinationType messageDestinationType)
    {
        var request = new ClientInboxRequest
        {
            Gcn = Gcn,
            ClientIpAddress = ClientIpAddress,
            CallingApplication = CallingApplication.Name,
            CallingApplicationVersion = CallingApplication.Version,
            CookieString = CookieString,
            HasPbUk = HasPbUk,
            HasIamIms = HasIamIms,
            HasPbZa = HasPbZa,
            HasSps = HasSps,
            HasWiUk = HasWiUk,
            HasWiZa = HasWiZa,
            LinkedGcns = LinkedGcns,
            RequestId = RequestId.ToString(),
            SsoProfiles = SsoProfiles.Select(x => x.Name).ToList()
        };

        MessageDestinationType messageDestination = (MessageDestinationType)messageDestinationType;

        return Ok(ClientMessageCenterHelper.ReadClientMessagesA(Gcn, messageDestination, request));
    }

enter image description here

错误消息:{“消息”:“请求无效。”,“MessageDetail”:“参数字典包含非可空类型'API.Domain.ClientMessageCenter.MessageDestinationType'for method'的参数'messageDestinationType'的空条目System.Web.Http.IHttpActionResult ReadClientMessagesC(API.Domain.ClientMessageCenter.MessageDestinationType)'in'ID.ClientMessageCenter.Controllers.ClientMessageCenterController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。 “ }

答案

你有几个不同的选择来解决这个问题:

  • 如果您可以更改发送到ReadClientMessagesC的数据,请将数据作为intEnum值)而不是Enum描述传递。
  • 如果无法更改传入数据,请将参数类型更改为string并在方法体中使用Enum.Parse或;
  • 保持方法编写并使用custom model binderstring转换为MessageDestinationType
另一答案

您应该为此选择字符串或整数来代替枚举。

如果仍需要使用它,则将其解析为枚举。

就个人而言,如果我在使用RESTful API,我会更喜欢整数,因为你在这里有效地暴露了一个Type。您可以通过Get / GetAll方法使这些类型可用,这样可以保持API的可维护性。

以上是关于带有枚举输入参数的Web Api post方法的主要内容,如果未能解决你的问题,请参考以下文章

参数中带有 IEnumerable 的 C# OData Web API POST 端点返回错误 400,输入无效

API开发实践 接受url请求

如何将类型的对象作为参数传递给Web Api Get / Post方法

使用 JSON 格式的 POST 方法 web api 将动态输入提交到数据库

PHP - 发送带有方法参数的 SOAP Web 服务

模型的Angular-Web api post方法为null