如何获取 getJSON 调用的 Api 控制器 Uri?
How to get Api Controller Uri for getJSON calls?
我正在尝试为 getJSON 调用获取 API 控制器的 Url。我在堆栈中看到的重复答案不起作用:
var elements = [];
$.getJSON("api/MySweetApi/Get", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
我的 ApiController 位于 ~/Controllers/api
。
是否有 'best practice' 用于将 link 处理到 MVC api 控制器?在一个完美的世界中,答案将挂接到路由引擎中,这样如果我们决定将我们的 api 控制器移动到 ~/api
它就可以工作而无需我们进行任何更改。
我的 WebApiConfig 是:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
编辑:见 post
末尾
您的控制器文件的位置无关紧要。基本上,要做到这一点,您必须编辑 App_Start/RoutConfig.cs 并添加新路由以告诉路由管理器什么 url 映射到哪个控制器。如果你只有一个 API 控制器,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/MySweetApi/{action}",
defaults: new { controller = "MySweetApi" }
);
如果你有多个,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/{controller}/{action}",
constraint: new { controller = "MySweetApi|MyOtherSweetApi|MyThirdAPI" }
);
如果您想了解有关路由及其可能性的更多信息,请查看 John Atten 的精彩 post:http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC
编辑:抱歉,我以为你问的是关于 mvc 路由的问题。
就我而言,我一直使用
@Url.Action("ControllerName", "ActionName")
它应该使用您的路由 table 来生成 URL,这样您的路由映射中的未来更改不应破坏您所有的 api url。
这个有效:
$.getJSON('@Url.HttpRouteUrl("DefaultApi", new RouteValueDictionary{ {"action","Get"}, {"controller", "MySweetApi"}})', null, function (data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
然而,这似乎真的很冗长而且没有必要。
您似乎在询问 WebAPI。由于 WebAPI 按照惯例不使用操作方法名称,因此您需要像这样调用方法:
var elements = [];
$.getJSON("api/MySweetApi/", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
这应该return MySweetApi 控制器上的 Get 方法中的所有记录。
我正在尝试为 getJSON 调用获取 API 控制器的 Url。我在堆栈中看到的重复答案不起作用:
var elements = [];
$.getJSON("api/MySweetApi/Get", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
我的 ApiController 位于 ~/Controllers/api
。
是否有 'best practice' 用于将 link 处理到 MVC api 控制器?在一个完美的世界中,答案将挂接到路由引擎中,这样如果我们决定将我们的 api 控制器移动到 ~/api
它就可以工作而无需我们进行任何更改。
我的 WebApiConfig 是:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
编辑:见 post
末尾您的控制器文件的位置无关紧要。基本上,要做到这一点,您必须编辑 App_Start/RoutConfig.cs 并添加新路由以告诉路由管理器什么 url 映射到哪个控制器。如果你只有一个 API 控制器,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/MySweetApi/{action}",
defaults: new { controller = "MySweetApi" }
);
如果你有多个,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/{controller}/{action}",
constraint: new { controller = "MySweetApi|MyOtherSweetApi|MyThirdAPI" }
);
如果您想了解有关路由及其可能性的更多信息,请查看 John Atten 的精彩 post:http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC
编辑:抱歉,我以为你问的是关于 mvc 路由的问题。
就我而言,我一直使用
@Url.Action("ControllerName", "ActionName")
它应该使用您的路由 table 来生成 URL,这样您的路由映射中的未来更改不应破坏您所有的 api url。
这个有效:
$.getJSON('@Url.HttpRouteUrl("DefaultApi", new RouteValueDictionary{ {"action","Get"}, {"controller", "MySweetApi"}})', null, function (data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
然而,这似乎真的很冗长而且没有必要。
您似乎在询问 WebAPI。由于 WebAPI 按照惯例不使用操作方法名称,因此您需要像这样调用方法:
var elements = [];
$.getJSON("api/MySweetApi/", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
这应该return MySweetApi 控制器上的 Get 方法中的所有记录。