Маршруты .NET Core Web API и запрос GET - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующий контроллер (приложение .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 клиент запрашивает Site s только от Source, я, однако, получаю все сайты, функция с параметром int source не вызывается ... Почему?

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);
        })
    );
}

enter image description here

1 Ответ

0 голосов
/ 09 ноября 2018

Уверен, это из-за [FromRoute], чтобы ваш URL работал /api/sites/1, HttpParams устанавливает строку запроса, которая теперь выглядит так: /api/sites?source=1

Если вы хотите использовать строку запроса, вы должны изменить свой контроллер на [FromQuery]

EDIT: Из-за AmbiguousActionException: Multiple actions matched. альтернативное решение объединит оба.

[HttpGet] 
public IDictionary<int, Site> GetSites([FromQuery] int? source) {
    if (source.HasValue) {
        // get specific 
    } else {
        // get all
    }
}
...