У меня есть проект, который должен использовать Angular2 (final) для публикации на старый, старый сервер Tomcat 7, предоставляющий несколько REST-ish API, используя страницы .jsp.
Это отлично работало, когда проект был просто простым JQuery-приложением, выполняющим запросы AJAX. Однако объем проекта вырос настолько, что его необходимо будет переписать с использованием более современных рамок. Angular2 выглядит фантастически для работы, за одним исключением: он отказывается выполнять POST-запросы, используя что-либо, но как данные формы, которые API не извлекает. API ожидает, что все будет urlencoded, опираясь на синтаксис Java request.getParameter("param")
, чтобы извлечь отдельные поля.
Это отключено из моего 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));
}
}
);
}
}
Независимо от того, каким я настроил тип содержимого заголовка, он всегда попадает в некодированные данные формы. Это не соответствует заголовку, который я устанавливаю.
Кто-нибудь еще столкнулся с этим? Как вы собираетесь форсировать Angular2 данные POST в формате, который может быть прочитан старым Java API с помощью request.getParameter("param")
?
Изменить: для всех, кто находит это в будущем, решение на самом деле очень просто. Установите тело сообщения следующим образом:
let body = `username=${username}&password=${password}`;`
См. пример Брэда ниже.