Web API 空白参数值被转换为 null

Posted

技术标签:

【中文标题】Web API 空白参数值被转换为 null【英文标题】:Web API whitespace parameter value being converted to null 【发布时间】:2021-02-15 23:47:46 【问题描述】:

我有一个简单的 Web API 服务。大约有 10 种不同的 GET 操作,它们根据输入参数返回各种数据库记录的 JSON 输出。

对于一个特定的端点,一个空格,' ' 应该是一个有效的参数,但它被转换为 null。有没有办法解决这个问题?

例如网址是:http://localhost:1234/DataAccess/RetrieveProductData?parameterOne=null&parameterTwo=574&problemParameter=%20&parameterThree=AB12

在控制器动作中,我可以看到以下内容:

int? parameterOne => null
string parameterTwo => "574"
string problemParameter => null
string parameterThree => "AB12"

有什么办法可以真正得到:

string problemParameter => " "

或者这不可能?

【问题讨论】:

你试过用+代替%20吗? @PavelAnikhouski 结果相同。但是,只有当参数只有空格时,例如 +++++ -> null++A++ -> `A ` @Ben 你用这个有什么收获吗?我也遇到了同样的问题。 @DavidPoxon 在下面看到我的回答。我确实解决了这个问题。 【参考方案1】:

我通过添加ParameterBindingRule 解决了这个问题,该ParameterBindingRule 具有足够的标准来匹配我遇到问题的确切参数:

注册码:

config.ParameterBindingRules.Add(p =>
            
                // Override rule only for string and get methods, Otherwise let Web API do what it is doing
                // By default if the argument is only whitespace, it will be set to null. This fixes that
                // commissionOption column default value is a single space ' '.
                // Therefore a valid input parameter here is a ' '. By default this is converted to null. This overrides default behaviour.
                if (p.ParameterType == typeof(string) && p.ActionDescriptor.SupportedHttpMethods.Contains(HttpMethod.Get) && p.ParameterName == "commissionOption")
                
                    return new StringParameterBinding(p);
                

                return null;
            );

StringParameterBinding.cs:

public StringParameterBinding(HttpParameterDescriptor parameter)
    : base(parameter)



public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)

    var value = actionContext.Request.GetQueryNameValuePairs().Where(f => f.Key == this.Descriptor.ParameterName).Select(s => s.Value).FirstOrDefault();

    // By default if the argument is only whitespace, it will be set to null. This fixes that
    actionContext.ActionArguments[this.Descriptor.ParameterName] = value;

    var tsc = new TaskCompletionSource<object>();
    tsc.SetResult(null);
    return tsc.Task;

【讨论】:

【参考方案2】:

您应该在客户端应用程序中执行此操作。你想在 android 上反序列化它吗?

【讨论】:

你是什么意思?客户端应用程序在 URL 中发送“”或 %20(正确)。我的服务隐式将此值转换为 null(不正确)。

以上是关于Web API 空白参数值被转换为 null的主要内容,如果未能解决你的问题,请参考以下文章

FastJson 转换 javaBean 时 null 值被忽略都问题

为可为空的函数参数提供“null”时如何使用默认值?

报表服务器:如果参数 = null 或空白,如何选择所有内容(启用多个值)

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL

Oracle————存储过程与函数

Oracle————存储过程与函数