1
votes

Angular 6/7 - obtenez le statut de réponse HTTP complet en service

J'ai le service suivant dans Angular 7:

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

Je souhaite obtenir l'état de la réponse (200, 401, etc.). Si j'essaie de m'abonner comme .pipe (map (.....)). Subscribe (...), j'obtiens une erreur indiquant que s'abonner n'est pas une fonction.

De plus, je reçois uniquement le 200 réponses d'état dans le tube (map ()). Je ne reçois pas de réponses avec d'autres codes de statut ici.

Je souhaite mettre à jour BehaviorSubject en fonction de l'état reçu.

Comment puis-je obtenir toutes les réponses et leur statut dans le service ?

J'ai traversé Angular 6 Get response headers avec httpclient issue , mais cela ne s'applique pas ici.

J'ai ajouté observer: 'response' aux en-têtes http, mais cela n'a fait aucune différence.

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


3 commentaires

Donc, vous utilisez {observe: 'response'} et cela n'a pas fonctionné?


@TonyNgo Comment puis-je ajouter {observe: 'response'} dans mes httpOptions?


@TonyNgo {observe: 'response'} n'a pas fonctionné pour moi


3 Réponses :


0
votes

Voici comment je l'ai fait:

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

En utilisant Angular HttpClient et en m'abonnant à l'observable renvoyée par http.get .


2 commentaires

Mais j'ai aussi besoin de passer mes en-têtes dans la requête. Comment puis-je ajouter {observe: 'response'} dans mes httpOptions?


import {HttpHeaders} depuis '@ angular / common / http'; Vous construirez donc les en-têtes comme suit: let headers = new HttpHeaders (); headers = headers.set ('Autorisation', 'Basic xzeydyt ==');



0
votes

dans Angular 7, la meilleure façon d'ajouter un en-tête à la requête est d'utiliser l'intercepteur. dans les intercepteurs, vous pouvez ajouter un en-tête à la requête et par conséquent, vous pouvez accéder à l'API protégée. voici l'exemple d'intercepteur qui ajoute un en-tête à la requête:

       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 commentaires

0
votes

Dites à HttpClient que vous voulez la réponse complète avec l'option observer:

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

Maintenant HttpClient.get () renvoie un observable de HttpResponse typé pas seulement les données JSON.


4 commentaires

J'obtiens une erreur: les types de propriété «observer» sont incompatibles. Le type 'string' ne peut pas être affecté au type '"body"'.


pouvez-vous mettre le type httpOptions à any . Je l'avais édité dans la réponse


l'ajout de tout me donne une erreur: le type 'Response' ne contient pas les propriétés suivantes du type 'ArrayBuffer': byteLength, slice, [Symbol.toStringTag]


Pouvez-vous vérifier le code modifié? J'ai ajouté le tuyau que tu as mis dans la question