我正在尝试使用asp.net mvc 4构建一个web api。假设我们有Books资源。获取,发布,删除工作正常,但万一发布我有点困惑。我想要使用PUT的方式是CQRS,如:一个动作PUT用于更新标题,另一个动作PUT用于更新作者,另一个用于更新书籍。所有这些PUT操作都被不同类型的命令重载,它们只有一个参数。当我尝试向此资源发出PUT请求时,来自MVC的路由失败,说这是与请求匹配的多个PUT操作。任何人都可以建议如何配置路由来处理:
public HttpResponseMessage Put(MakeFavorite mf){/*code*/}
public HttpResponseMessage Put(ChangeTitle ct){/*code*/}
public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}
答案 0 :(得分:6)
我认为最好不要在这里应用RPC,即使David解决方案也有一些RPC工件。 首先,你应该设计你的URI结构。例如:
/books/{bookId}/favouritestate/{state}
/books/{bookId}/title/{title}
/books/{bookId}/author/{author}
然后更新路由表以处理此问题:
routes.MapHttpRoute(
name: "BookTitleApiRoute",
routeTemplate: "books/{bookId}/title/{title} ",
defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
);
然后添加一些控制器。例如:
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
}
}
你也可以在这样的对象之间插入关系。
希望这将有助于ypu构建漂亮的RESTful API =))
答案 1 :(得分:0)
由于每个函数彼此之间并没有多大关系,因此您应该尝试将每个put方法放在不同的控制器中。
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
}
}