C# 如何路由API和使用查询字符串?

C# 如何路由API和使用查询字符串?,c#,api,asp.net-web-api,asp.net-web-api-routing,C#,Api,Asp.net Web Api,Asp.net Web Api Routing,我正在尝试制作一个API,它将根据您搜索的内容(电话号码、电子邮件、姓名)获取人员列表 我的问题是我不知道如何路由API来做这样的事情 [HttpGet, Route("SearchBy/{**searchByType**}/people")] [NoNullArguments] [Filterable] public IHttpActionResult FindPeople([FromUri] string searchByType, object queryValue) { var

我正在尝试制作一个API,它将根据您搜索的内容(电话号码、电子邮件、姓名)获取人员列表

我的问题是我不知道如何路由API来做这样的事情

[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);
}
[HttpGet,Route(“SearchBy/{**searchByType**}/people”)]
[非完整参数]
[可过滤]
公共IHttpActionResult FindPeople([FromUri]字符串searchByType,对象queryValue)
{
var response=newlist();
开关(按类型搜索)
{
案例“电话号码”:
response=peopleFinder.FindPeople((电话号码)queryValue);
打破
案例“电子邮件”:
response=peopleFinder.FindPeople((电子邮件)queryValue);
打破
案例“名称”:
response=peopleFinder.FindPeople((名称)queryValue);
打破
}
返回Ok(响应);
}

我是创建一个
SearchBy
对象并从中传入一个成员,还是以某种方式使用
enum
或常量?

我建议稍微改变一下。首先,您可以将路由模板更改为更加RESTful。下一步,您的隐藏数据源可能会更具体一些

//Matches GET ~/people/phone/123456789
//Matches GET ~/people/email/someone@example.com
//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);
}
//匹配GET~/people/phone/123456789
//匹配项获取~/人/电子邮件/someone@example.com
//匹配得到~/people/name/John Doe
[HttpGet,Route(“people/{searchByType:regex(^phone | email | name$)}/{filter}”)]
[非完整参数]
[可过滤]
公共IHttpActionResult FindPeople(字符串searchByType、字符串筛选器){
var response=newlist();
开关(searchByType.ToLower()){
案例“电话”:
响应=peopleFinder.FindPeopleByPhone(过滤器);
打破
案例“电子邮件”:
响应=peopleFinder.FindPeopleByMail(过滤器);
打破
案例“名称”:
response=peopleFinder.FindPeopleByName(过滤器);
打破
违约:
返回请求();
}
返回Ok(响应);
}
参考: