我正在创建一个 Web Api 控制器。我想在单个控制器中创建多个 Get 函数。见下文:
// GET api/User/5
[ResponseType(typeof(UserModel))]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
public IHttpActionResult GetCities(int id)
{
var item = repository.GetCities(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
下面是我的 WebApi 路由配置
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Controllers with Actions
// To handle routes like `/api/VTRouting/route`
config.Routes.MapHttpRoute(
name: "DefaultApiwithActionID",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
下面是我的 API 控制器
// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/UserApi/GetUser")]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/5
[ResponseType(typeof(TanentDocumentsModel))]
[Route("api/UserApi/GetUserDocuments")]
public IHttpActionResult GetUserDocuments(Guid id)
{
var item = repository.GetUserDocuments(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/UserApi/GetCities")]
public IHttpActionResult GetCities(int id)
{
var item = repository.GetCities(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(StateModel))]
[Route("api/UserApi/GetStates")]
public IHttpActionResult GetStates(int id)
{
var item = repository.GetStates(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
我该怎么做才能通过 URL 调用这两个函数?
使用在方法和 webapiconfig 文件中指定的路由。
喜欢 关于方法
[ResponseType(typeof(UserModel))]
[HttpGet]
[Route("api/getusers/{id}")]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
like others
[Route("api/getcities/{id}")]
或者您可以在文件中指定
config.Routes.MapHttpRoute(
name: "users",
routeTemplate: "api/getusers/{id}",
defaults: new { action = "GetUser", controller = "Users" }
);
这样你可以指定其他人
IMO,最简单的方法是使用属性路由来做到这一点。 在每个方法前面添加路由参数,您可以在其中指定方法路由。
// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
var item = repository.GetCities(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
最简单的方法,更新 webapiconfig 文件。
// GET api/User/5
[HttpGet]
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
var item = repository.GetCities(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
您还必须将其分配到 Area API 文件夹 ApiAreaRegistration.cs 文件中
context.Routes.MapHttpRoute(
"Api_default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { area = "Api", id = RouteParameter.Optional }
);
这样,你得根据你的项目分配
下面是我的 WebApi 路由配置
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Controllers with Actions
// To handle routes like `/api/VTRouting/route`
config.Routes.MapHttpRoute(
name: "DefaultApiwithActionID",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
下面是我的 API 控制器
// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/UserApi/GetUser")]
public IHttpActionResult GetUser(Guid id)
{
var item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/5
[ResponseType(typeof(TanentDocumentsModel))]
[Route("api/UserApi/GetUserDocuments")]
public IHttpActionResult GetUserDocuments(Guid id)
{
var item = repository.GetUserDocuments(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/UserApi/GetCities")]
public IHttpActionResult GetCities(int id)
{
var item = repository.GetCities(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}
// GET api/User/GetCities/5
[ResponseType(typeof(StateModel))]
[Route("api/UserApi/GetStates")]
public IHttpActionResult GetStates(int id)
{
var item = repository.GetStates(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return Ok(item);
}
}