如何使Angular 2将所有请求发送为application/x-www-form-urlencoded
如何使Angular 2将所有请求发送为application/x-www-form-urlencoded
我之前在Angular 1中遇到过类似的问题,所以我知道如何实现,只是缺少最后一步。
就像上次一样,我们的应用程序的后端人员接受使用application/x-www-form-urlencoded
类型的请求,Angular 2也是使用application/json
类型发送请求。
在ng1中,我在配置中修改了http提供程序,以便将每个请求的body运行为urlencoded。
我在ng2中看到有一个BaseRequestOptions类,我认为它正是为此而设计的,只是文档有些不完整
,所以我不确定如何正确实现(我也是TypeScript的新手)。
我应该如何提供这个功能,以便每个post
和其他请求在最后发送时都是urlencoded
的(我还希望该函数在body上运行,以便它真正地变成urlencoded)。
另外:为什么没有一个更简单的选项来解决这个问题,因为到现在为止,我可以看到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))
问题的出现原因:想要让Angular 2发送的所有请求都以application/x-www-form-urlencoded的形式发送。
解决方法:
1. 创建一个DefaultRequestOptions类,继承自BaseRequestOptions,并设置headers的Content-Type为application/x-www-form-urlencoded。
2. 在boot.ts中,使用DefaultRequestOptions类作为默认的请求选项,将其提供给Http服务,并注入HTTP_PROVIDERS。
3. 在组件中使用Http对象时,不要再声明HTTP_PROVIDERS,以免覆盖boot.ts中注入的Http对象。
具体代码如下:
// DefaultRequestOptions.ts 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]}) ]);
以上代码可以实现让Angular 2发送的所有请求都以application/x-www-form-urlencoded的形式发送。