Comment faire pour forcer Angular2 à l'aide de x-www-form-urlencoded

J'ai un projet qui nécessite l'utilisation de Angular2 (final) à la poste à un ancien, hérité de Tomcat 7 serveur fournissant un peu de REPOS-ish de l'API à l'aide .des pages jsp.

Cela a bien fonctionné lorsque le projet n'était qu'un simple JQuery application d'effectuer des requêtes AJAX. Toutefois, la portée du projet a pris une ampleur telle qu'il aura besoin d'être réécrit dans un cadre moderne. Angular2 l'air fantastique pour l'emploi, à une exception près: Il refuse d'effectuer des requêtes POST avec tout option, mais la mise en forme des données, ce qui l'API n'est pas extrait. L'API s'attend à ce que tout soit urlencoded, en s'appuyant sur Java request.getParameter("param") syntaxe d'extraire des champs.

C'est un ciselée de mon utilisateur.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));
                }
            }
        );
    }
}

Peu importe ce que j'ai mis l'en-tête de type de contenu, il finit toujours par arriver à la non-codée de données de formulaire. C'est ne pas honorer l'en-tête de je suis.

Quelqu'un d'autre a rencontré ce? Comment allez-vous forcer Angular2 pour publier des données dans un format qui peut être lu par un vieux API Java à l'aide de request.getParameter("param")?

Modifier: Pour quelqu'un d'autre qui trouve cela dans l'avenir, la solution est en fait très simple. Définir le corps du post comme ceci:

let body = `username=${username}&password=${password}`;`

Voir Brad exemple ci-dessous.

  • Je pense qu'il est assez boiteux qui angulaire qui rend si difficile la poste www-form-urlencoded. Il devrait y avoir de soutien de première classe pour le faire facilement.
  • cela ne semble pas fonctionner avec Angular4+ et HttpClient.
  • Vous avez raison, @stt106. Cette solution est vieux et spécifiques pour les versions inférieures à 4. Je vais réécrire la solution ci-dessus pour HttpClient quand j'ai le temps.