webapi

Różne metody HTTP

Posted on Updated on

Chciałem skorzystać z metody Delete

$.ajax({
    url: "/api/ShoppingBagApi",
    contentType: "application/json; charset=utf-8",
    data: {id:11},
    type: "Delete"
}).done(function() {
    alert("done");
}).fail(function() {
    alert("fail");
});

niestety nie mapowało mi się to id w kontrolerze.

[HttpDelete]
public HttpResponseMessage Delete(int id)
{
    return null;
}

Problemem było korzystanie z data. To jest wykorzystawane gdy korzystamy z POST. Wystarczyło zmienić na coś takiego:

$.ajax({
    url: "/api/ShoppingBagApi/" + 11,
    contentType: "application/json; charset=utf-8",
    type: "Delete"
}).done(function() {
    alert("done");
}).fail(function() {
    alert("fail");
});

Korzystałem z domyslengo routing dla WebApi

protected override void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{
    base.RegisterRoutes(routes);
    routes.MapHttpRoute(
        "API Default",
        "api/{controller}/{id}",
        new {id = RouteParameter.Optional}
        );
}

Nie muszę korzystać z action, wystarczy mieć po jednej akcji dla każdego typu metody HTTP i się dobrze zmapuje.

Update

Powyżej się myliłem, rozwiązanie działało rykoszetem(łapało się na id = RouteParameter.Optional).

public class ShoppingBagDeleteItemRequest
{
    public int Id { get; set; }
}

[HttpDelete]
public HttpResponseMessage Delete(DeleteItemRequest deleteItemRequest)
{
    return null;
}
$.ajax({
    url: "/api/ShoppingBagApi",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({ Id: item.id }),
    type: "Delete"
})

Po tych zabiegach wszystko dobrze się mapuje. Jest to zdecydowanie lepszy, bardziej przejrzysty sposób.