【问题标题】:Re-routing API in ASP.NET MVC4 application在 ASP.NET MVC4 应用程序中重新路由 API
【发布时间】:2012-08-22 22:56:00
【问题描述】:

我编写了一个 API,它使用标准的 HTTP Post、Get、Put 和 Delete 属性以及 VS 2012 配置的路由

routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

现在我已经开始使用 HTML5 和 JavaScript 开发我的网站,但我发现 Delete 和 Put 在任何浏览器中都不是支持方法。我需要将我的 Delete 更改为 Post 以及 Puts。

为此,我需要执行以下任一操作,并且我正在寻找“最佳实践”建议: 1.) 创建另一个带有添加参数的 Post 方法以指定它是删除

//This is really my delete method
public virtual HttpResponseMessage Post(TEntity entity, bool delete)

2.) 更改路由以使用操作名称,然后将我的 Post 方法命名为“删除”,这样会更有意义

//New Routing
routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

//More meaningful post method
[HttpPost]
public virtual HttpResponseMessage Post(TEntity entity){}

请注意,我希望外部用户能够绑定到 API,因此我正在寻找最佳实践建议。 API 路由中有 {action} 是否常见?

提前致谢

编辑:

使用 Ajax,我在我的 API 中点击了我的 Delete 方法,但是我的“字符串 id”参数为空。我尝试了两种方法在我的 JavaScript 中执行这个 ajax 请求。两者都在同一方法中:

    function AjaxReq() {
        $.ajax({
            url: 'http://localhost:49482/api/pallets/',
            type: 'delete',
            data: { id: 12 },
            success: function (response) { alert("Success") },
            error: function (response) { alert("Failed:" + response) }
        });
    }

    function httpRequest() {
        var request = new XMLHttpRequest();
        request.open("delete", "http://localhost:49482/api/pallets/", true);
        request.send("id=12");
        alert(request.responseText);
    }

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    你到底是什么意思:

    Delete 和 Put 不是任何浏览器都支持的方法

    form 元素确实只支持 POST 和 GET(虽然有基于隧道的解决方法)但是当您使用 RESTful API 时,您通常会通过 JavaScript 发出 XMLHttpRequest(例如通过使用 @987654322 @) 并且 XMLHttpRequest 在所有主流浏览器中都支持 GET、POST、PUT 和 DELETE。

    回到您的确切问题,重新配置路由以使用操作名称并为您的操作提供有意义的名称的方法更加清晰。

    关于编辑的更新

    DELETE 方法请求源服务器删除 URI 标识的资源。实际上,这意味着您应该将 Id 放入 URL(jQuery 仅对 GET 方法自动执行此操作):

    function AjaxReq() {
        $.ajax({
            url: 'http://localhost:49482/api/pallets/12',
            type: 'delete',
            success: function (response) { alert("Success") },
            error: function (response) { alert("Failed:" + response) }
        });
    }
    
    function httpRequest() {
        var request = new XMLHttpRequest();
        request.open("delete", "http://localhost:49482/api/pallets/12", true);
        request.send();
        alert(request.responseText);
    } 
    

    这应该适用于默认路由。

    【讨论】:

    • 我不知道 ajax 可以处理删除方法。我创建了一个 ajax 请求,它确实在我的 API 中命中了正确的删除方法。现在我只需要弄清楚为什么参数“string id”为空。
    • @MichaelNorgren 向我们展示您的 JavaScript 和 action sygnature,我们会尽力提供帮助。
    • 我已经用我的 JavaScript 和我的两个 JavaScript 函数更新了我的帖子。这两者,id 都为空。感谢您的帮助!
    • 谢谢先生。感谢您的帮助。
    【解决方案2】:

    HTML 规范与 HTTP 规范是分开的。 HTML 仅支持 POST 和 GET。您需要使用 AJAX 调用其他方法,例如 HEAD、OPTIONS、DELETE、PUT、PATCH...

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多