如何让Angular 2将所有请求发送为application/x-www-form-urlencoded格式

10

我曾经在Angular 1中遇到相似的问题,所以我知道如何实现,只是缺少最后一步。

就像上一次一样,我们应用程序的后端接受类型为application/x-www-form-urlencoded的请求,并且像Angular 1一样,Angular 2也会将它们发送为application/json类型。

我在ng1中所做的是,在配置文件中修改http提供程序,使其在每个请求的正文中运行urlencode。

我在ng2中看到有https://angular.io/docs/ts/latest/api/http/BaseRequestOptions-class.html一个BaseRequestOptions类,我想这个类专门为此而设计,只是文档有点欠缺,所以我不确定如何正确实现它(我也是TypeScript新手)。

我该如何提供此内容,以便我的每个post和其他请求最终都以urlencoded形式发送(我还希望将函数运行在正文上,以便它实际上成为urlencode)。

另外:为什么没有更简单的选项呢?因为到目前为止,我可以看到ASP.Net和Flask(我想许多其他框架也是如此)默认不支持application\json

编辑:我制作了一个自定义函数,我在POST主体中发送的每个对象上使用它,但我希望有一个更简单,更通用的解决方案。

import { URLSearchParams } from 'angular2/http';

export function urlEncode(obj: Object): string {
    let urlSearchParams = new URLSearchParams();
    for (let key in obj) {
        urlSearchParams.append(key, obj[key]);
    }
    return urlSearchParams.toString();
}

然后我像这样使用它

this.http.post('http://localhost:5000/user/auth/login', urlEncode(data))
1个回答

12

试试这样:

DefaultRequestOptions.ts

@Injectable()
export class DefaultRequestOptions extends BaseRequestOptions{
    headers:Headers = new Headers({
        'Content-Type': 'application/x-www-form-urlencoded'
    });
}

boot.ts

bootstrap(AppComponent,[
    HTTP_PROVIDERS,
    provide( RequestOptions, { useClass: DefaultRequestOptions } ),
    provide(Http, { useFactory:
        function(backend, defaultOptions) {
            return new Http(backend, defaultOptions); },
        deps: [XHRBackend, RequestOptions]})
]);

重要提示:确保不要在使用Http对象的组件中再次声明HTTP_PROVIDERS,否则它将覆盖boot.ts中注入的HTTP_PROVIDERS。


对于其他函数,您可以将其添加到任何@Injectable对象中,将该对象添加到组件的构造函数中,然后可以从任何组件中以这种方式调用它,或者您可以尝试扩展angular http对象并覆盖post方法,以便在后台为每个post请求执行该操作。


你是否正在使用Angular2的http模块? - Langley
是的。我正在使用http来进行post请求,就像这样:http.post('http://localhost:5000/user/auth/login', { 'email': this.emailModel, 'password': this.passwordModel })。 - ditoslav
我更新了答案,已经测试过并且可以正常工作。如果你仍然有问题,请查看以下资源: BaseRequestOptionsHTTP_PROVIDERS Headers - Langley
@Langley 我遇到了一个错误,无法找到名称为provide的变量.. 我是否漏掉了某个导入? - Piotr Stulinski
我觉得不行,他们在其中一个版本的 RCS 中改变了 http 模块的实现方式,所以这段代码可能已经不能正常工作了,你很可能需要稍微修改一下。 - Langley
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接