J'ai un projet qui nécessite l'utilisation d'Angular2 (final) pour poster sur un vieux serveur Tomcat 7 fournissant une API de type REST à l'aide de pages .jsp.
Cela fonctionnait bien lorsque le projet n'était qu'une simple application JQuery effectuant des requêtes AJAX. Toutefois, l'ampleur du projet a pris une telle ampleur qu'il doit être réécrit à l'aide d'un framework plus moderne. Angular2 semble fantastique pour ce travail, à une exception près : Il refuse d'exécuter des requêtes POST en utilisant une autre option que des données de formulaire, que l'API n'extrait pas. L'API s'attend à ce que tout soit urlencodé, en s'appuyant sur la fonction Java request.getParameter("param")
pour extraire des champs individuels.
Voici un extrait de mon fichier user.service.ts :
import { Injectable } from '@angular/core';
import { Headers, Response, Http, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class UserService {
private loggedIn = false;
private loginUrl = 'http://localhost:8080/mpadmin/api/login.jsp';
private headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'});
constructor(private http: Http) {}
login(username, password) {
return this.http.post(this.loginUrl, {'username': username, 'password': password}, this.headers)
.map((response: Response) => {
let user = response.json();
if (user) {
localStorage.setItem('currentUser', JSON.stringify(user));
}
}
);
}
}
Quel que soit le type de contenu de l'en-tête, il finit toujours par arriver sous forme de données de formulaire non codées. Il n'honore pas l'en-tête que j'ai défini.
Quelqu'un d'autre a-t-il rencontré ce problème ? Comment faire pour forcer Angular2 à POST des données dans un format qui peut être lu par une ancienne API Java en utilisant request.getParameter("param")
?
Editar : Pour tous ceux qui trouveront ce problème à l'avenir, la solution est en fait très simple. Définissez le corps du message comme ceci :
let body = `username=${username}&password=${password}`;`
Voir l'exemple de Brad ci-dessous.
1 votes
Je pense que c'est plutôt nul qu'angular rende si difficile le fait de poster comme
www-form-urlencoded
. Il devrait y avoir un soutien de première classe pour faire cela facilement.1 votes
Cela ne semble plus fonctionner avec Angular4+ et HttpClient.
0 votes
Vous avez raison, @stt106. Cette solution est ancienne, et spécifique aux versions antérieures à la 4. Je réécrirai la solution ci-dessus pour HttpClient lorsque j'aurai le temps.