我们公司正在为我们的产品开发 API,我们正在考虑使用 ASP.NET MVC。在设计 API 时,我们决定使用如下调用,让用户从 API 请求 XML 格式的信息:
如您所见,传递了多个参数(即artist
和api_key
)。在 ASP.NET MVC 中,artist
将是 controller
、getImages
操作,但我如何将多个参数传递给操作?
这甚至可以使用上面的格式吗?
MVC 中直接支持参数,只需将参数添加到您的操作方法中即可。给定如下操作:
public ActionResult GetImages(string artistName, string apiKey)
当给出如下 URL 时,MVC 将自动填充参数:
/Artist/GetImages/?artistName=cher&apiKey=XXX
另一种特殊情况是名为“id”的参数。任何名为 ID 的参数都可以放入路径而不是查询字符串中,例如:
public ActionResult GetImages(string id, string apiKey)
将使用如下所示的 URL 正确填充:
/Artist/GetImages/cher?apiKey=XXX
此外,如果您有更复杂的场景,您可以自定义 MVC 用于定位操作的路由规则。您的 global.asax 文件包含可以自定义的路由规则。默认情况下,规则如下所示:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
如果你想支持这样的网址
/Artist/GetImages/cher/api-key
您可以添加如下路线:
routes.MapRoute(
"ArtistImages", // Route name
"{controller}/{action}/{artistName}/{apikey}", // URL with parameters
new { controller = "Home", action = "Index", artistName = "", apikey = "" } // Parameter defaults
);
和上面第一个例子一样的方法。
从 MVC 5 开始,您还可以使用属性路由将 URL 参数配置移动到您的控制器。
此处提供了详细讨论:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx
概括:
首先你启用属性路由
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
}
然后您可以使用属性来定义参数和可选的数据类型
public class BooksController : Controller
{
// eg: /books
// eg: /books/1430210079
[Route("books/{isbn?}")]
public ActionResult View(string isbn)
您可以通过查询字符串传递任意参数,但您也可以设置自定义路由以 RESTful 方式处理它:
http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
api_key=b25b959554ed76058ac220b7b2e0a026
那可能是:
routes.MapRoute(
"ArtistsImages",
"{ws}/artists/{artist}/{action}/{*apikey}",
new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
);
因此,如果有人使用以下路线:
ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/
它会将它们带到您的示例查询字符串所做的相同位置。
以上只是一个示例,并没有应用您必须设置的业务规则和约束,以确保人们不会“破解”该 URL。