@z_a_p_a_r_a

Как получить данные c JSON ответа при BadRequest?

Доброго времени суток! И так снова наверное для кого то банальный вопрос(но не для меня).
И так приложение ASP.NET Core + Angular 7. Работаю с аутентификацией. В контролере пробую создать пользователя
var result =await _userManager.CreateAsync(applicationUser, model.Password);
           return Ok(result);


Если есть ошибка то получаю например следующее:
{
    "succeeded": false,
    "errors": [
        {
            "code": "PasswordTooShort",
            "description": "Passwords must be at least 6 characters."
        },
        {
            "code": "PasswordRequiresLower",
            "description": "Passwords must have at least one lowercase ('a'-'z')."
        }
    ]
}


Если же все ок тогда:
{
    "succeeded": true,
    "errors": []
}


Этот ответ обрабатываю в компоненте Angular следующим образом:
this.service.register().subscribe(
      (res: any) => {
        if (res.succeeded) {
          this.service.formModel.reset();
          this.toast.success('You create a user','SUCCESS');
        } else {
          res.errors.forEach(element => {
            switch (element.code) {
              case 'DuplicateUserName':
                this.toast.error('User with this name is exist', 'ERROR');
                break;
              default:
                this.toast.error(element.description,'ERROR');
                break;
            }
          });
        }
      },
      err => {
        this.toast.error(err.message,'ERROR');
      }
    );


Здесь все работает все ок.
При неудачной аутентификации делаю следующие:
return BadRequest(new { message = "Password is incorect" });

либо
return BadRequest(new { message = "User name is incorect" });

Как результат получаю JSON формата
{
    "message": "User name is incorect"
}

При удачной аутентификации
return Ok(new { token });
как результат - что то типа этого:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiIwMDA3MTBmMi1mNWM1LTRmMzgtYmQ3My02MjhlNmE0YTg3YmEiLCJuYmYiOjE1NTc4NzE1NzgsImV4cCI6MTU1Nzg3MTg3OCwiaWF0IjoxNTU3ODcxNTc4fQ.n2vfnFbvrH7MnDwAnI2055_fKpG3wEjRItFdTr38mlE"
}

Фууу наверное много лишнего здесь набросал, но что бы было понятно... даже таким как я)))
Так вот добрались до проблемы) Хочу вывести сообщения об ошибки при аутентификации, но не просто этого типа
if(err.status == 400){
          this.toast.error('Username or password is bad', 'Authentication error');
        }else{
          console.log(err);
        }

А именно вытянуть из JSON "message".
Пробовал как то так:
this.service.login(form.value).subscribe(
      (res:any)=>{
        if(res.token){
          localStorage.setItem('token', res.token);
          this.router.navigateByUrl('/home');
        }else{
          if(res.message){
            this.toast.error(res.message,'ERROR');
          }
        }
      },
      err=>this.toast.error(err.message,'ERROR')
    );

Но не работает.... Я так понимаю при BadRequest "message" из JSON не присваивается параметрам метода:
(method) Observable<Object>.subscribe(next?: (value: Object) => void, error?: (error: any) => void, complete?: () => void): Subscription (+1 overload)

Ну или я что то криво пишу.
Как вытянуть значение "message" из моего JSON?
Заранее благодарен... И извините за такую простыню текста)))
  • Вопрос задан
  • 598 просмотров
Решения вопроса 1
@alexkhismatulin
Посмотри доки по обработке ошибок в ангуляре.
В объекте ошибки есть поле error - в нем и будет лежать твой JSON:
this.service.login(form.value).subscribe(
  (res: any) => {
    if(res.token) {
      localStorage.setItem('token', res.token);
      this.router.navigateByUrl('/home');
    }
    else {
      if (res.message) {
        this.toast.error(res.message,'ERROR');
      }
    }
  },
  (err) => {
    console.log(err.error);
  }
);


Посмотри, что есть в объекте ошибки в песочнице, пригодится
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы