Mat
Mat

Reputation: 139

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

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.

Upvotes: 0

Views: 5840

Answers (3)

Federico Dipuma
Federico Dipuma

Reputation: 18265

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

Upvotes: 1

Phong Nguyen
Phong Nguyen

Reputation: 181

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

Upvotes: 0

Anton Kozlovsky
Anton Kozlovsky

Reputation: 213

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'.

Upvotes: 1

Related Questions