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 或空白,如何选择所有内容(启用多个值)