【发布时间】:2012-08-06 18:19:18
【问题描述】:
我主要是使用默认的WebApi路由映射,如下:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
一切正常,我的网址如下所示:
[GET] /api/customers Get all customers
[GET] /api/customers/1 Get a specific customer
[POST] /api/customers Create a customer
到目前为止一切都很好,但现在我想添加一个“搜索”工具。为此,我将发布一个表示搜索条件的对象,因为在 URL 上作为 GET 执行此操作的选项太多。我的计划是 URL 看起来像这样:
[POST] /api/customers/search
但是,使用上面的默认路由,服务器抱怨“找到了与请求匹配的多个操作”,我认为这是因为我现在有两个接受 POST 数据的控制器方法(一个用于“创建”,一个用于"search"),并且路由没有办法区分它们。
我尝试添加一个包含 {action} 组件的新路由映射,但这并没有解决问题 - 大概是因为 URL 对 both 路由映射都有效。 (我需要以某种方式阻止“/search”变体与默认路由图匹配。
请给点建议?
【问题讨论】:
-
“我将发布一个代表搜索条件的对象”是什么意思?请您根据搜索条件举例说明 POST(创建新对象)吗?
-
我的意思是,我将在我的请求正文中发布一个定义搜索词的对象,而不是在我的搜索词等中使用查询字符串参数。所以 URL 将简单地是 /api/customers/search 但请求正文将包含一个 XML 或 JSON 块,告诉服务器要搜索哪些词等。
-
你为什么不使用 [POST] /api/customers?search={your search term}?
-
因为我的网址太长了。搜索条件包括日期范围、标签和各种其他选项——这就是我需要发布它的原因。
-
POST 表示你需要在web服务器上创建资源,如果你只是查询而不修改任何东西,使用GET,这是设计REST的原则。查询中的搜索条件很长也没关系:)
标签: asp.net-mvc asp.net-mvc-routing asp.net-web-api