user6641597
user6641597

Reputation: 37

How to route an API and use a query string?

I am trying to make an API that will Get a list of people depending on what you search by - PhoneNumber, Email, Name

My issue is I am not sure how to Route the API to do something like this...

[HttpGet, Route("SearchBy/{**searchByType**}/people")]
[NoNullArguments]
[Filterable]
public IHttpActionResult FindPeople([FromUri] string searchByType, object queryValue)
{
    var response = new List<SearchSummary>();
    switch (searchByType)
    {
        case "PhoneNumber":
            response = peopleFinder.FindPeople((PhoneNumber)queryValue);
            break;
        case "Email":
            response = peopleFinder.FindPeople((Email)queryValue);
            break;
        case "Name":
            response = peopleFinder.FindPeople((Name) queryValue);
            break;
    }
    return Ok(response);
}

Do I create a SearchBy object and pass in a member from that or maybe use an enum or constant somehow?

Upvotes: 2

Views: 76

Answers (1)

Nkosi
Nkosi

Reputation: 247008

I would advise change things up a bit. First you can change the route template to be a little more RESTful. Next your under-lying data source could be a little more specific with the search.

//Matches GET ~/people/phone/123456789
//Matches GET ~/people/email/[email protected]
//Matches GET ~/people/name/John Doe  
[HttpGet, Route("people/{searchByType:regex(^phone|email|name$)}/{filter}")]
[NoNullArguments]
[Filterable]
public IHttpActionResult FindPeople(string searchByType, string filter) {
    var response = new List<SearchSummary>();
    switch (searchByType.ToLower()) {
        case "phone":
            response = peopleFinder.FindPeopleByPhone(filter);
            break;
        case "email":
            response = peopleFinder.FindPeopleByEmail(filter);
            break;
        case "name":
            response = peopleFinder.FindPeopleByName(filter);
            break;
        default:
            return BadRequest();
    }
    return Ok(response);
}

Reference: Attribute Routing in ASP.NET Web API 2

Upvotes: 1

Related Questions