我有以下 Controller (.NET Core Web API 应用程序)
(Source
包含多个 Site
)
SitesController.cs
// GET: api/sites
[HttpGet]
public IDictionary<int, Site> GetSites() {
return _db.Sites.ToDictionary(s => s.SiteId, s => s);
}
// GET: api/sites?source=5
[HttpGet("{source}")]
public IDictionary<int, Site> GetSites([FromRoute] int source) {
return _db.Sites.Where(s => s.SourceId == source).ToDictionary(s => s.SiteId, s => s);
}
// GET: api/sites/5
[HttpGet("{id}")]
public async Task<IActionResult> GetSite([FromRoute] int id) {
当Angular客户端仅从Source
询问Site
时,我得到了所有站点,具有的功能int source
param 没有被调用...为什么?
findAllSourceSites(sourceId: number): Observable<Site[]> {
return this.http.get(`${this.API_URL}/api/sites`, {
params: new HttpParams()
.set('source', sourceId.toString())
}).pipe(
map(res => {
return Object.values(res);
})
);
}
最佳答案
很确定这是因为 [FromRoute]
的缘故,您的 URL 应该是 /api/sites/1
,HttpParams
正在设置查询字符串,现在您的 URL 看起来像 /api/sites?source=1
如果您想使用查询字符串,您应该将 Controller 更改为[FromQuery]
编辑:
由于AmbigouslyActionException:多个操作匹配。
替代解决方案将两者结合在一起。
[HttpGet]
public IDictionary<int, Site> GetSites([FromQuery] int? source) {
if (source.HasValue) {
// get specific
} else {
// get all
}
}
关于javascript - .NET Core Web API 路由和 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53230811/