在测试HTML页面中通过JS调用我的API时,无论如何都不会返回任何结果。经过研究,我得出的结论是,它没有找到我的API控制器(不太可能,因为它使用一些示例代码但具有相同的URI返回了结果),或者是找到了但没有找到正确的操作。该应用程序的重点是发送youtube搜索请求并接收返回的结果列表。
我尝试在整个代码中设置断点,它似乎只在HTML页面上的JS中运行,而从未真正击中控制器本身。当我添加了一个不带参数的新方法以返回列表的一个结果(确实返回了结果),但是似乎在没有任何更改的情况下不久就停止工作时,这种情况发生了改变。
这是HTML文档中调用API的代码
<div style="width:500px;margin:0 auto;position:relative;">
<div style="background-color:yellow;height:100px">Header</div>
<div style="background-color:aquamarine; height: 400px">Body</div>
<div style="background-color:red;width:100px;position:absolute;top:100px;right:0;">ABC</div>
</div>
这是用于API路由的默认代码:
var uri = 'api/Search';
function formatItem(item) {
return item.title;
}
function find() {
var word = $('#srval').val();
$.getJSON(uri + '/' + word)
.done(function (data) {
$('#product').text(formatItem(data));
})
.fail(function (jqXHR, textStatus, err) {
$('#product').text('Error: whyyyyyyyyyyyyy');
});
}
这是我要调用的控制器方法
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
//defaults: new { id = RouteParameter.Optional }
defaults: new { id = RouteParameter.Optional }
);
以及代码中出现的搜索控制器的名称,其中删除了其中的方法:
[HttpGet]
public IHttpActionResult GetSearch(string search)
{
getyoutuberesults(search);
var results = searcheslist;
return Ok(results);
}
预期结果是HTML标签“ product”充满了YouTube搜索HTML标签“ srval”的值的结果。
相反,该页面仅在按下搜索按钮时冻结,并且如上所述,看上去甚至从未到达GetSearch方法。直接转到URI localhost:44345 / api / Search / [搜索词]会导致以下错误消息:
找不到与请求URI'https://localhost:44345/api/Search/test'相匹配的HTTP资源。 在控制器“搜索”上未找到与请求匹配的操作。
答案 0 :(得分:3)
路由模板参数名称不匹配。默认约定路由为{id}
,而控制器动作为search
参数。导致未找到所需操作的原因(404)。
首先考虑启用属性路由,然后考虑使用
// Attribute routing.
config.MapHttpAttributeRoutes(); //<---THIS HERE BEFORE CONVENTION BASED ROUTING
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
并相应地装饰控制器
[RoutePrefix("api/search")]
public class SearchController : ApiController {
//...
//GET api/search/word
[HttpGet]
[Route("{search}")]
public IHttpActionResult GetSearch(string search) {
var results = getyoutuberesults(search);
return Ok(results);
}
//...
}