我有一个项目需要使用Angular2(最终版)来发布到旧的、遗留的Tomcat7服务器上,该服务器使用.jsp页面提供有点像睡觉的API.

当项目只是一个执行Ajax请求的简单JQuery应用程序时,这可以很好地工作.然而,该项目的范围已经扩大到需要使用更现代化的框架进行重写.Angular2看起来非常适合这项工作,但有一个例外:它拒绝使用除表单数据以外的任何选项执行POST请求,API不会提取表单数据.API期望所有内容都经过urlended编码,依赖于Java的request.getParameter("param")语法来提取各个字段.

这是从我的用户那里剪下来的.服务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以旧的Java API可以使用request.getParameter("param")读取的格式发布数据?

Edit:对于将来发现这一点的任何其他人来说,解决方案实际上非常简单.将柱体设置如下:

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

见下面Brad的例子.

推荐答案

UPDATE June 2020: This answer is 4 years old and no longer valid due to API changes in Angular. Please refer to more recent answers for the current version approach.


您可以使用URLSearchParams作为请求主体,angular将自动将内容类型设置为application/x-www-form-urlencoded,并正确编码主体.

let body = new URLSearchParams();
body.set('username', username);
body.set('password', password);

this.http.post(this.loginUrl, body).map(...);

它目前不适用于您的原因是您没有以正确的格式编码正文数据,并且没有正确设置标题选项.

你需要对身体进行如下编码:

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

您需要如下设置标题选项:

this.http.post(this.loginUrl, body, { headers: headers }).map(...);

Angular相关问答推荐

NGX- colored颜色 Select 器安装出错

Angular 16+使用ngTemplateOutlet有条件地呈现几个模板中的一个

当在server.ts文件中定义API路径时,Angular 17构建失败

ngx-http-client 在 Angular 16 中已弃用

用于 React 的 ngx-extended-pdf-viewer

升级到 Ng 16 - npm 错误!对等依赖冲突:@angular/compiler-cli@16.2.1

执行ng generate environments时出错时需要合集和原理图

无法将项目从 Angular 13 更新到 14

Angular:try 在点击次数后禁用按钮

Angular 从 13.3.8 恢复到 13.3.7

尽管模型中的变量发生了变化,但Angular 视图没有更新

如何在数据表angular material中显示空消息,如果未找到数据

Angular CLI 自定义 webpack 配置

无法绑定到matMenuTriggerFor,因为它不是 button的已知属性

如何使用 Bootstrap 4 flexbox 填充可用内容?

Angular2 + Jspm.io:使用类decorator 时需要反射元数据垫片

Angular2 - 从外部验证和提交表单

找不到@angular/common/http模块

如何升级 Angular CLI 项目?

Angular Material - 如何向禁用的按钮添加工具提示