【问题标题】:How to get Api Controller Uri for getJSON calls?如何获取用于 getJSON 调用的 Api Controller Uri?
【发布时间】:2015-08-09 12:52:55
【问题描述】:

我正在尝试获取用于 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

是否有处理指向 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 }
        );
    }
}

【问题讨论】:

    标签: jquery ajax asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    编辑:见文末

    控制器文件的位置无关紧要。基本上,要做到这一点,您必须编辑 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 的这篇精彩帖子:http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC

    编辑:对不起,我以为你问的是 mvc 路由。

    就我而言,我一直使用

    @Url.Action("ControllerName", "ActionName")
    

    它应该使用您的路由表来生成 URL,因此路由映射中的未来更改不应破坏您所有的 api url。

    【讨论】:

    • 使用我的示例代码没有调用路由引擎。我不确定使用路由引擎的最佳做法是什么
    • 至少默认情况下,在一个新的MVC网站中,有一个RouteConfig.RegisterRoutes(RouteTable.Routes);在 Global.asax 的 Application_Start() 中
    • 当我使用 Url.Action 时,我得到一个 404。这在 getJSON 中对你有用吗?
    • 你也可以创建一个集中的 js 函数,比如 urlAPI("MySweetApi","Get") ,它会返回一个 bulded url,所以你只能在函数中更改它网址格式
    【解决方案2】:

    您似乎在询问 WebAPI。由于按照惯例,WebAPI 不使用操作方法名称,因此您需要像这样调用该方法:

    var elements = [];
    $.getJSON("api/MySweetApi/", null, function(data) {
        $.each(data, function(index, element) {
            elements.push(element.ReferenceNumber + " - " + element.Description);
        });
    });
    

    这应该返回 MySweetApi 控制器上 Get 方法中的所有记录。

    【讨论】:

    • MVC 渲染管道对您使用 api/MySweetApi 有何反应?因为对我来说,当我使用这个链接时,我会得到一个 404。但是,stackoverflow.com/a/30483132/82333 有效,因为我正在使用管道。
    【解决方案3】:

    这行得通:

    $.getJSON('@Url.HttpRouteUrl("DefaultApi", new RouteValueDictionary{ {"action","Get"}, {"controller", "MySweetApi"}})', null, function (data) {
        $.each(data, function(index, element) {
            elements.push(element.ReferenceNumber + " - " + element.Description);
        });
    });
    

    但是,它似乎非常冗长且不必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 2023-03-10
      • 1970-01-01
      • 2013-07-27
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多