在ASP.NET MVC4应用程序中重新路由API

时间:2012-08-28 12:24:46

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

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

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

现在我已经开始使用HTML5和JavaScript开发我的网站,并且发现在任何浏览器中Delete和Put都不是支持方法。我需要将我的删除更改为帖子以及我的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方法,但是我的“string id”参数为null。我尝试了两种在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);
    }

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你究竟是什么意思:

  

删除和放置不是任何浏览器中的支持方法

form元素确实只支持POST和GET(虽然有基于隧道的解决方法)但是当您使用RESTful API时,通常是通过JavaScript创建XMLHttpRequest(例如使用$.ajax)和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);
} 

这应该与默认路由一致。

答案 1 :(得分:0)

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