Voici mon code:
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
logIn(username: string, password: string) {
const url = 'http://server.com/index.php';
const body = JSON.stringify({username: username,
password: password});
const headers = new HttpHeaders();
headers.set('Content-Type', 'application/json; charset=utf-8');
this.http.post(url, body, {headers: headers}).subscribe(
(data) => {
console.log(data);
},
(err: HttpErrorResponse) => {
if (err.error instanceof Error) {
console.log('Client-side error occured.');
} else {
console.log('Server-side error occured.');
}
}
);
}
et ici le débogage du réseau:
Request Method:POST
Status Code:200 OK
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:46
Content-Type:text/plain
et les données sont stockées dans 'Request Payload' mais dans mon serveur ne reçoit pas les valeurs POST:
print_r($_POST);
Array
(
)
Je crois que l'erreur vient de l'en-tête non défini lors du POST, qu'est-ce que j'ai fait de mal?
angular
http-headers
angular-httpclient
Frennetix
la source
la source
Réponses:
Les instances de la nouvelle
HttpHeader
classe sont des objets immuables . L'appel des méthodes de classe renverra une nouvelle instance comme résultat. Donc, fondamentalement, vous devez faire ce qui suit:ou
Mise à jour: ajout de plusieurs en-têtes
ou
Mise à jour: accepter la mappe d'objets pour les en-têtes et paramètres HttpClient
Depuis la version 5.0.0-beta.6, il est désormais possible de sauter la création d'un
HttpHeaders
objet et de passer directement une carte d'objets en argument. Alors maintenant, il est possible de faire ce qui suit:la source
set
nom de la méthode est quelque peu trompeur.HttpHeaders().set(..).set(..)
mais maintenant encore les en-têtes ne sont pas écrits dans les champs d'en-tête HTTP?!Pour ajouter plusieurs paramètres ou en-têtes, vous pouvez effectuer les opérations suivantes:
la source
lazyUpdate
propriété, mais finalement cela plantera à l'CreateListFromArrayLike
exception de la mise en vigueur de la demande en vous y abonnant.définissez les en-têtes http comme ci-dessous dans votre requête http
la source
J'ai lutté avec ça pendant longtemps. J'utilise Angular 6 et j'ai trouvé que
n'a pas marché. Mais ce qui a fonctionné était
fait, ce qui a du sens lorsque vous réalisez qu'ils sont immuables. Donc, après avoir créé un en-tête, vous ne pouvez pas y ajouter. Je ne l'ai pas essayé, mais je soupçonne
fonctionnerait aussi.
la source
let
peut résoudre le problèmeJ'étais avec Angular 8 et la seule chose qui a fonctionné pour moi était la suivante:
la source
Dans le manuel ( https://angular.io/guide/http ) j'ai lu: La classe HttpHeaders est immuable, donc chaque set () retourne une nouvelle instance et applique les changements.
Le code suivant fonctionne pour moi avec angular-4:
la source
Dans mon ancienne application, Array. De prototype js était en conflit avec Array. De angular qui causait ce problème. Je l'ai résolu en sauvegardant la version Array.fr d'angular et en la réaffectant après le chargement du prototype.
la source
Exemple de service Angular 8 HttpClient avec gestion des erreurs et en- tête personnalisé
Consultez l'exemple de tutoriel complet ici
la source