Angular 6/7 - получить полный HTTP-статус ответа в сервисе - PullRequest
0 голосов
/ 21 мая 2019

У меня есть следующий сервис в Angular 7:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class UserService {

  private currentUserSubject: BehaviorSubject<any>;

  constructor(
    private http: HttpClient
  ) {
    this.currentUserSubject = new BehaviorSubject(null);
  }

  public get currentUserValue(): any {
    return this.currentUserSubject.value;
  }

  login(entity: any, inputUsername: any, inputPassword: any): any {

    const httpOptions = {
      headers: new HttpHeaders({
        username: inputUsername,
        password: inputPassword
      })
    };

    return this.http.get(entity.url, httpOptions)
    .pipe(map((user: Response) => {
      console.log(user);
      console.log(user.status);

      if (user) {
          this.currentUserSubject.next(user);
      }
      return user;
  }));
  }
}

Я хочу получить статус ответа (200, 401 и т. Д.).Если я пытаюсь подписаться, например .pipe (map (.....)). Subscribe (...), я получаю сообщение об ошибке, что подписка не является функцией.

Кроме того, я получаю только 200статусные ответы в трубе (map ()).Я не получаю ответы с другими кодами состояния здесь.

Я хочу обновить BehaviorSubject на основе полученного статуса.

Как я могу получить все ответы и их статус в службе?

Я прошел, хотя Angular 6 Получите заголовки ответа с проблемой httpclient , но здесь это не относится.

Я добавил наблюдение: «ответ» на заголовки http, но это не имело никакого значения.

const httpOptions = {
      headers: new HttpHeaders({
        username: inputUsername,
        password: inputPassword,
        observe: 'response',
      }),
    };

Ответы [ 4 ]

0 голосов
/ 21 мая 2019

Скажите HttpClient, что вы хотите получить полный ответ с опцией наблюдения:

const httpOptions:any = {
  headers: new HttpHeaders({
    username: inputUsername,
    password: inputPassword
  }),
  observe: 'response',
};
return this.http.get<any>(entity.url, httpOptions) //I put the type of the response data as `any` you can put the type of user
 .pipe(map((user: HttpResponse<any>) => {//same type as above statement
   console.log(user);
   console.log(user.status);

   if (user) {
      this.currentUserSubject.next(user);
   }
   return user;
 }));

Теперь HttpClient.get() возвращает Observable с типом HttpResponse, а не только данные JSON.

0 голосов
/ 21 мая 2019

Так что вы можете сделать это

Мой подход позволяет добавлять желаемый тип ответа в свой API


import { HttpHeaders } from '@angular/common/http';

const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type':  'application/json',
    'Authorization': 'my-auth-token',
    'observe': 'response' 
  })
};

this.http.get(this.url, httpOptions).subscribe(response => console.log(response.status)); 
0 голосов
/ 21 мая 2019

в Angular 7, лучший способ добавить заголовок к запросу, используя перехватчик.в перехватчиках вы можете добавить заголовок к запросу и в результате вы можете получить доступ к защищенному API.Вот пример перехватчика, который добавляет заголовок к запросу:

       intercept(request: HttpRequest<any>, next: HttpHandler): 
            Observable<HttpEvent<any>> {
            let currentUser = this.authservice.currentUser;
         if (currentUser && currentUser.token) {
           request = request.clone({
           setHeaders: {
           Authorization: `Bearer ${currentUser.token}`
           }
          });
         }

         return next.handle(request)
0 голосов
/ 21 мая 2019

Вот как я это сделал:

this.http.get(this.url, { observe: 'response' })
  .subscribe(response => console.log(response.status));

Использование Angular HttpClient и подписка на наблюдаемое, возвращаемое из http.get.

...