Web API2自定义接口Postman调用报错:请求匹配多动作求助
解决Web API 2自定义Action的Postman调用问题
看起来你遇到的是路由不匹配导致的404错误(返回HTML错误页面),下面一步步帮你搞定:
问题根源
- 你给
GetDetails方法加了Attribute路由[Route("api/Homes/GetDetails")],但你的WebApiConfig里大概率没启用Attribute路由支持,导致这个自定义路由根本不生效。 - 就算路由生效了,你访问的URL
http://localhost:59381/api/Homes/GetDetails/TEST里的TEST是作为URL段传递的,但你的Attribute路由模板里没定义id的占位符,系统没法识别这个参数。 - 另外,你的默认路由
api/{controller}/{id}也不会匹配GetDetails这个Action——因为默认路由模板里没有action的位置,Web API不知道要调用这个自定义方法。
解决方案
步骤1:启用Attribute路由
先在WebApiConfig.cs里添加Attribute路由的启用代码,注意要放在默认路由配置之前:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 先启用Attribute路由,这步必须有 config.MapHttpAttributeRoutes(); // 再配置默认路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } ); } }
步骤2:调整路由模板或请求方式
你有两种方式可以让Postman正确调用接口:
方式一:修改Attribute路由,包含id占位符
把Action的Route属性改成带{id}的模板,这样URL段的TEST就能被识别为id参数:
[Route("api/Homes/GetDetails/{id}")] // 这里加上{id}占位符 [HttpGet] public IHttpActionResult GetDetails(string id) { var x = db.Homes.Where(b => b.HomeID == id) .Select(b => new { Description = b.Description, FacebookLink = b.FacebookLink, InstagramLink = b.InstagramLink }); // 注意:Where返回的是IQueryable,永远不会为null,要判断是否有数据 if (!x.Any()) { return NotFound(); } return Ok(x); }
之后在Postman里用这个URL调用:http://localhost:59381/api/Homes/GetDetails/TEST
方式二:用查询字符串传递id参数
如果不想修改路由模板,保持原来的[Route("api/Homes/GetDetails")],那就在Postman里用查询字符串传id:http://localhost:59381/api/Homes/GetDetails?id=TEST
Web API会自动从查询字符串里抓取id参数,这样也能正常调用接口。
额外小提示
你的代码里if (x == null)永远不会触发——因为db.Homes.Where(...)返回的是IQueryable<T>类型,哪怕没有匹配数据,它也不会为null,只是没有元素。所以改成if (!x.Any())才能正确判断是否找到数据,返回NotFound()。
内容的提问来源于stack exchange,提问作者coffe addict
相关产品推荐
相关产品推荐

