Тип носителя не поддерживается 415 из Angular 7 SPA в .NET, в то время как запрос работает в Почтальоне - PullRequest
0 голосов
/ 11 октября 2019

Когда мой SPA выполняет вызов к определенной конечной точке в моем .NET API, к которому я недавно добавил нумерацию страниц, я получаю 415 Unsupported Media Type Error, однако, когда я делаю тот же вызов из Почтальона, он успешно выполняется,Я не уверен, почему я получаю ошибку от SPA для идентичного вызова в почтальоне.

Я проверил конечную точку от Почтальона и обнаружил, что она работает, и убедился, что я звоню так жеконечная точка из моего SPA.

Вызов внешнего интерфейса:

  fetchChanges(page?, itemsPerPage?){
    const paginatedResult: PaginatedResult<Change[]> = new PaginatedResult<Change[]>();

    let params = new HttpParams();

    if (page != null && itemsPerPage != null){
      params = params.append("pageNumber", page);
      params = params.append("pageSize", itemsPerPage);
    }

      return this.http.get(
        this.apiUrl + '/changelog/' + this.model, { observe: "response", params })
        .pipe(
          map((responseData: any) => {
            paginatedResult.result = responseData.body;
            if (responseData.headers.get("Pagination") != null){
              paginatedResult.pagination = JSON.parse(responseData.headers.get("Pagination"));
            }
              return paginatedResult;
          })
        )
  }

Функция контроллера для конечной точки:


        [HttpGet("{model}")]
        public async Task<IActionResult> GetChangeLog(int userId, string model, ChangeLogParams changeLogParams)
        {
            if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
                return Unauthorized();

            var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);

            var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);

            Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);

            return Ok(changeLogForReturn);
        }

Я ожидаю, что интерфейс выполнит запрос, и вернул постраничныйрезультаты. enter image description here

Код для приложения можно найти здесь: https://github.com/DomTripodi93/ProductionDotNet

1 Ответ

0 голосов
/ 11 октября 2019

После изучения моих заголовков я понял, что в Postman я устанавливаю свой контент на JSON, что-то, что Angular "post" / "put" / "patch" делает автоматически, но, конечно, не "get". Это заставило меня понять, что у меня все еще было мое тело запроса на вход в Postman. После очистки тела я получил ошибку 400 «тело запроса не может быть установлено нулевым», что заставило меня понять, что по какой-то причине моя конечная точка ожидала тело запроса с моим запросом «get».

        [HttpGet("{model}")]
        public async Task<IActionResult> GetChangeLog(int userId, string model, ChangeLogParams changeLogParams)
        {
            if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
                return Unauthorized();

            var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);

            var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);

            Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);

            return Ok(changeLogForReturn);
        }

После просмотра кода я обнаружил, что проблема заключалась в том, что мой аргумент ChangeLogParams в бэкэнде ожидался как тело запроса.

Добавление [FromQuery] к аргументу ChangeLogParams для получения моих данных подкачки из параметров вместо тела запроса решило мою проблему.

        [HttpGet("{model}")]
        public async Task<IActionResult> GetChangeLog(int userId, string model, [FromQuery]ChangeLogParams changeLogParams)
        {
            if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
                return Unauthorized();

            var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);

            var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);

            Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);

            return Ok(changeLogForReturn);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...