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

j'ai une application ionique 2 utilisant Angular 2, qui envoie un Http PUT à un ASP.NET serveur API de base. Voici la méthode que j'utilise pour envoyer la requête:

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 mets une clé d'authentification / valeur sur l'objet headers.

Mais quand je reçois cette requête 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 sur la photo, il y a de touches sur le en-tête, mais pas les clés de contenu et d'authentification que j'ai ajoutées manuellement à l'en-tête de l'application client.

Qu'est-ce que je fais de mal?

29
demandé sur Zach Becknell 2016-12-14 05:11:51

6 réponses

votre paramètre pour les options de requête dans http.put () devrait en fait être de type RequestOptions. Essayez quelque chose comme ceci:

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)
55
répondu Paul Jerome Bordallo 2018-06-08 01:46:55

Angulaire 4 >

vous pouvez soit configurer les en-têtes manuellement, soit créer un intercepteur HTTP.

Prérequis Angulaire <4.3:

s'il vous Plaît assurez-vous d'utiliser @angular/common/http tout au long de votre application (ceci a été changé en angle 4.3).


Manuellement

la classe HttpHeaders est immuable, donc chaque set() renvoie une nouvelle instance et applique les modifications.

à Partir de l'angle docs.

création d'un en-tête:

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

configuration des en-têtes multiples:

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()

intercepteur HTTP

une caractéristique majeure de @angular/common/http est l'interception, la possibilité de déclarer les intercepteurs qui se trouvent entre votre application et le backend. Lorsque votre application fait une requête, les intercepteurs la transforment avant de l'envoyer au serveur, et les intercepteurs peuvent transformer la réponse sur le chemin du retour avant que votre application ne la voit. Ceci est utile pour tout d'authentification à l'exploitation forestière.

à Partir de l'angle docs.

assurez-vous d'utiliser @angular/common/http tout au long de votre application. De cette façon, vos demandes seront traitées 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);
        }
    }
}

Étape 2, l'ajouter à votre module:

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

Utile liens:

23
répondu Brampage 2018-08-06 09:16:40

ceci devrait être facilement résolu en important des en-têtes D'angle:

import { Http, Headers } from "@angular/http";
2
répondu Isto Barton 2017-09-11 21:27:03

On peut le faire bien à l'aide de Intercepteurs. Vous n'avez pas à définir les options dans tous vos services ne gèrent pas toutes vos réponses d'erreur, il suffit de définir 2 intercepteurs (un pour faire quelque chose avant d'envoyer le demande au serveur et à l'un de faire quelque chose avant d'envoyer le la réponse à votre service)

  1. Définir AuthInterceptor classe de faire quelque chose avant d'envoyer la requête au serveur. Vous pouvez configurer l'api token (récupérez-le à partir de localStorage, voir étape 4) et d'autres options dans cette classe.
  2. Définir respondsinterceptor classe pour faire quelque chose avant d'envoyer la réponse du serveur à votre service (httpClient). Vous pouvez gérer la réponse de votre serveur, le plus simple est de vérifier si le token de l'utilisateur est valide (si pas effacer le token de localStorage et rediriger vers login).
  3. Dans votre app.module importer HTTP_INTERCEPTORS à partir de '@angulaire/common/http". Ajoutez ensuite à vos fournisseurs les intercepteurs (AuthInterceptor et responsseinterceptor). En faisant cela, votre application considérera les intercepteurs dans tous nos appels httpClient.

  4. lors de la connexion réponse http (utilisez http service), enregistrer le token à localStorage.

  5. alors utilisez httpClient pour tous vos services les plus appropriés.

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

enter image description here

2
répondu Daniel Eduardo Delgado Diaz 2017-09-12 04:16:45

Vous avez une faute de frappe.

changement:headers.append('authentication', ${student.token});

À:headers.append('Authentication', student.token);

notez le Authentification est en majuscule

0
répondu theCrab 2017-09-11 19:36:50

Pour nous, nous avons utilisé une solution comme ceci:

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

Référence ici

0
répondu cjohansson 2018-05-29 08:39:53