Return an error when invalid parameters are specified in ASP Web API

我们两清 提交于 2019-12-02 18:39:33

问题


I'm creating an API using C# and ASP.NET Web API and I want it to return an error when a parameter is used that isn't recognised.

For example:

/api/Events

should a list of events

/api/Events?startTime={{startTime}}

should return a list of events that started at a particular time

/api/Events?someRandomInvalidParameter={{something}}

should return an error

Is there a nice config way to do this? If not, how can I get a list of parameters to check myself.


回答1:


You could create an ActionFilter to automate this:

public class InvalidQueryStringRejectorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var arguments = actionContext.ActionArguments.Keys;

        var queryString = actionContext.Request.GetQueryNameValuePairs()
            .Select(q => q.Key);

        var invalidParams = queryString.Where(k => !arguments.Contains(k));

        if (invalidParams.Any())
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
            {
                message = "Invalid query string parameters",
                parameters = invalidParams
            });
        }
    }
}

That filter will reject any request with query string parameters that do not match the method signature.

You may use it like this:

[InvalidQueryStringRejector]
public IHttpActionResult Get(string value)
{
    return Ok(value);
}

Or apply to any action by registering it inside your HttpConfiguration object:

config.Filters.Add(new InvalidQueryStringRejectorAttribute());



回答2:


try strongly typed actions like this

  public string Get()
        {
            return "I'm alive empty";
        }

  public string Get([FromUri] int id)
        {
            return "I'm alive";
        }

So normal call will return I'm alive or I'm alive empty

  http://localhost:1578/api/alive?id=1 //OR
  http://localhost:1578/api/alive

But if you try to call it like this

http://localhost:1578/api/alive?blablabla=1

You will occure this error The requested resource does not support http method 'GET'.




回答3:


I think you should be override methods
Example:

[Route("/app/Events/{startTime})"]
public ApiResponse Get(string startTime)
{
}


[Route("/app/Events/{startTime}/{someRandomeInvalid}")]
public ApiResponse Get(string startTime, string someRandomeInvalid)
{
}


Don't set explicit parameters name. You should be manage/check by order of parameter



来源:https://stackoverflow.com/questions/37786405/return-an-error-when-invalid-parameters-are-specified-in-asp-web-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!