我有一些方法,我想遵循其网址的特定模式。
基本上有餐馆,有ID,还有一些终端。
我正试图让以下类型的模式出现: api /餐厅 - 获取所有餐厅 api / Restaurant / Bobs - 获得Bobs ID的餐厅 api /餐厅/ Bobs /终端 - 在bobs餐厅享受所有终端 api /餐厅/凸台/终端/秒 - 在餐厅鲍勃获得ID为秒的终端
我已经有了这样做的方法,并且我已经为每个分配了Route属性,如下所示:
[HttpGet]
public IEnumerable<IRestaurant> Get()
{
//do stuff, return all
}
[HttpGet]
[Route("api/Restaurant/{restuarantName}")]
public IRestaurant Get(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restuarant/{restaurantName}/terminals")]
public IEnumerable<IMiseTerminalDevice> GetDevices(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
public IMiseTerminalDevice GetDeviceByName(string restaurantName, string terminalName)
{
//do stuff
}
然而,只有我的基本GET(api /餐厅)正在运作。我的WebAPI配置是默认配置,读取
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
有人知道我哪里出错吗?所有其他方法都会返回路由不匹配(带有ID的餐馆)或404.
提前致谢!
答案 0 :(得分:8)
我刚刚创建了包含ProductsController的默认WEB API项目。接下来,我将你的api方法粘贴在。
中 public class ProductsController:ApiController
{
[HttpGet]
[Route("api/Restaurant/{restaurantName}")]
public IHttpActionResult Get(string restaurantName)
{
//do stuff
return Ok("api/Restaurant/{restuarantName}");
}
[HttpGet]
[Route("api/restuarant/{restaurantName}/terminals")]
public IHttpActionResult GetDevices(string restaurantName)
{
//do stuff
return Ok("api/restuarant/{restaurantName}/terminals");
}
[HttpGet]
[Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
public IHttpActionResult GetDeviceByName(string restaurantName, string terminalName)
{
//do stuff
return Ok("api/restaurant/{restaurantName}/terminals/{terminalName}");
}
}
最后,我用Fiddler提出请求
**http://localhost:9969/api/restuarant/Vanbeo/terminals**
一切正常!
系统配置:Visual Studio 2013,WEB API 2.2,Net 4.5
请你试试一个空项目吗?
PS:我必须将此作为答案发布,因为评论中没有足够的空间!