54 votes

Comment définir correctement l'en-tête de requête HTTP dans Angular 2

J'ai un Ionique 2 application à l'aide Angulaire 2, qui est l'envoi d'un PUT de Http à un ASP.NET API de Base du serveur. Voici la méthode que j'utilise pour envoyer la demande:

public update(student: Student): Promise<Student>
{
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append('authentication', `${student.token}`);

    const url = `${this.studentsUrl}`;

    return this.http
        .put(url, JSON.stringify(student), { headers: headers })
        .toPromise()
        .then(() => student)
        .catch(this.handleError);
}

Je suis une authentification par clé/valeur sur les en-têtes de l'objet.

Mais quand je reçois cette demande sur le serveur, je ne trouve pas la clé d'authentification sur l'en-tête:

enter image description here

Comme vous pouvez le voir dans l'image, il y a beaucoup de touches sur la tête, mais pas le contenu et l'authentification des clés que j'ai ajouté manuellement à l'en-tête de l'application client.

Ce que je fais mal?

80voto

Votre paramètre pour les options de requête dans http.put () doit en réalité être du type RequestOptions. Essayez quelque chose comme ça:

 let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('authentication', `${student.token}`);

let options = new RequestOptions({ headers: headers });
return this.http
    .put(url, JSON.stringify(student), options)
 

64voto

Brampage Points 1101

Angulaire 4 >

Vous pouvez soit choisir de définir les en-têtes manuellement, ou de faire une HTTP intercepteur.

Conditions préalables pour Angulaires <4.3:

Assurez-vous d'utiliser @angular/common/http tout au long de votre application (ce que cela a changé dans Angulaire 4.3).


Manuellement

Le HttpHeaders classe est immuable, de sorte que chaque set() retourne une nouvelle instance et applique les changements.

À partir de l'angle de docs.

La fixation d'un en-tête:

http
  .post('/api/items/add', body, {
    headers: new HttpHeaders().set('Authorization', 'my-auth-token'),
  })
  .subscribe();

La définition de plusieurs en-têtes:

this.http
.post('api/items/add', body, {
  headers: new HttpHeaders({
    'Authorization': 'my-auth-token',
    'x-header': 'x-value'
  })
}).subscribe()

Variable locale (immuable instancier nouveau)

let headers = new HttpHeaders().set('header-name', 'header-value');
headers = headers.set('header-name-2', 'header-value-2');

this.http
  .post('api/items/add', body, { headers: headers })
  .subscribe()

HTTP intercepteur

L'une des caractéristiques majeures de @angulaire/common/http est l'interception, la possibilité de déclarer des intercepteurs qui siègent dans l'entre votre application et le backend. Lorsque votre application effectue une demande, les intercepteurs de la transformer avant de les envoyer au serveur, et les intercepteurs peuvent transformer la réponse sur son chemin de retour avant que votre demande ne la voit. C'est utile pour tout, de l'authentification à la connexion.

À partir de l'angle de docs.

Assurez-vous d'utiliser @angular/common/http tout au long de votre application. De cette façon, votre demande sera exercé par l'intercepteur.

Étape 1 créer le service:

import * as lskeys from './../localstorage.items';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders } from '@angular/common/http';

@Injectable()
export class HeaderInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (true) { // e.g. if token exists, otherwise use incomming request.
            return next.handle(req.clone({
                setHeaders: {
                    'AuthenticationToken': localStorage.getItem('TOKEN'),
                    'Tenant': localStorage.getItem('TENANT')
                }
            }));
        }
        else {
            return next.handle(req);
        }
    }
}

L'étape 2, l'ajouter à votre module:

providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: HeaderInterceptor,
      multi: true // Add this line when using multiple interceptors.
    },
    // ...
  ]

Liens utiles:

4voto

cjohansson Points 591

Pour nous, nous avons utilisé une solution comme celle-ci:

 this.http.get(this.urls.order + '&list', {
        headers: {
            'Cache-Control': 'no-cache',
        }
    }).subscribe((response) => { ...
 

Référence ici

3voto

Nous pouvons le faire bien à l'aide d'Intercepteurs. Vous n'avez pas à définir les options dans tous vos services ni la gestion de toutes vos réponses d'erreur, il suffit de définir 2 intercepteurs (un à faire quelque chose avant l'envoi de la demande au serveur et à un à faire quelque chose avant de l'envoyer au serveur la réponse à votre service)

  1. Définir un AuthInterceptor classe de faire quelque chose avant d'envoyer la requête au serveur. Vous pouvez définir la clé api (récupérer à partir de localStorage, voir l'étape 4) et d'autres options dans cette classe.
  2. Définir un responseInterceptor classe de faire quelque chose avant l'envoi de la réponse du serveur à votre service (client http). Vous pouvez gérer votre réponse du serveur, la plupart des comon utilisation est de vérifier si le jeton de l'utilisateur est valide (si pas clair jeton de localStorage et de redirection de connexion).
  3. Dans votre application.module d'importation HTTP_INTERCEPTORS de '@angulaire/common/http". Puis l'ajouter à vos fournisseurs, les intercepteurs (AuthInterceptor et responseInterceptor). Faisant cela, votre application va considérer les intercepteurs dans tous nos httpClient appels.

  4. Lors de la connexion de la réponse http (utiliser http service), enregistrez le jeton à localStorage.

  5. Ensuite, utilisez httpClient pour tous vos apirest services.

Vous pouvez vérifier les bonnes pratiques sur mon github proyect ici

enter image description here

2voto

Isto Barton Points 58

Cela devrait être facilement résolu en important des en-têtes depuis Angular:

 import { Http, Headers } from "@angular/http";
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X