Múltiples acciones PUT, asp.net mvc 4 web api

Estoy tratando de construir una API web usando asp.net mvc 4 para esto. Supongamos que tenemos el recurso Libros. Get, Post, Delete funciona bien, pero en caso de que Post esté un poco confundido. La forma en que quiero usar PUT es CQRS como: una acción PUT para actualizar el título, otra acción PUT para actualizar los autores y otra para hacer que el libro sea favorito. Todas estas acciones PUT están sobrecargadas con diferentes tipos de comandos y tienen un solo parámetro. Cuando intento realizar una solicitud PUT a este recurso, el enrutamiento de MVC falla, lo que indica que hay varias acciones PUT que coinciden con la solicitud. ¿Alguien podría sugerir cómo configurar el enrutamiento para manejar:

public HttpResponseMessage Put(MakeFavorite mf){/*code*/}

public HttpResponseMessage Put(ChangeTitle ct){/*code*/}

public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}

preguntado el 03 de mayo de 12 a las 19:05

2 Respuestas

Creo que es mejor no aplicar RPC aquí, incluso la solución de David tiene algunos artefactos de RPC. En primer lugar, debe diseñar su estructura de URI. Por ejemplo:

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  

Luego actualice su tabla de enrutamiento para manejar esto:

   routes.MapHttpRoute(
                name: "BookTitleApiRoute",
                routeTemplate: "books/{bookId}/title/{title}  ",
                defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
                );

Luego agregue algunos controladores. Por ejemplo:

 public class BookTitleController : ApiController
    {
        // GET /books/{bookId}/title/
        public HttpResponseMessage Get(string bookId)
        {
            return your book title
        }
        // PUT /books/{bookId}/title/{title}
        public HttpResponseMessage Put(string bookId,string title)
        {
            update book title and return result
        }

    }

También puede interpretar las relaciones entre objetos como ese, etc.

Espero que esto ayude a ypu a construir una buena API RESTful =))

contestado el 03 de mayo de 12 a las 19:05

Perdón por el comentario tardío ... Esto funciona para Put, pero ¿qué tal si tuviera múltiples Gets o Posts fuera del mismo controlador? ¿Es una buena idea tener varias publicaciones y entradas en el mismo controlador? - Skadoosh

¿Puede proporcionar un ejemplo de recurso que necesite múltiples Obtenciones o Publicaciones? En cuanto a Get, puede usar la anulación del método. - Aleksei Anufriev

También hay un verbo PATCH que está destinado a una actualización parcial. mnot.net/blog/2012/09/05/parche - Aleksei Anufriev

¿RPC? ¿Qué significa eso? - Ciaran Gallagher

Dado que cada función realmente no tiene mucho que ver entre sí, debe intentar poner cada método put en controladores respectivos separados.

public class MakeFavoriteController : ApiController
{
    public HttpResponseMessage Put(MakeFavorite mf)
    {
        // Code
    }
}

public class ChangeTitleController : ApiController
{
    public HttpResponseMessage Put(ChangeTitle ct)
    {
        // Code
    }
}

public class UpdateAuthorController : ApiController
{
    public HttpResponseMessage Put(UpdateAuthor ua)
    {
        // Code
    }
}

Respondido 29 Jul 12, 23:07

Creo que esos votos negativos son para el mecanismo de estilo RPC de su ejemplo. - Aleksei Anufriev

Eso supone / sugiere que, de hecho, no están relacionados. No estás respondiendo la pregunta directamente. - Arturo Hernández

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.