我和Angular 1有类似的问题所以我理解如何实现,只是我错过了最后一步。
就像上次一样,为我们的应用做后端的人接受application/x-www-form-urlencoded
类型的请求,就像Angular 1一样,Angular 2也会发送类型为application/json
的请求。
我对ng1所做的是在配置中我修改了http提供程序,以便在每个请求的主体上运行urlencoded。
我在ng2中看到有https://angular.io/docs/ts/latest/api/http/BaseRequestOptions-class.html
一个BaseRequestOptions
类,我认为它只是为了这个唯一的文档而有点not there
所以我不确定如何正确实现它(我也是TypeScript的新手)。
如何提供此功能,以便我的post
和其他请求中的每一个都以urlencoded
结尾发送(我还希望函数在主体上运行,以便它实际上变为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))
答案 0 :(得分: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中注入的组件。
对于其他函数,您可以将其添加到任何@Injectable对象中,将该对象添加到组件的构造函数中,然后可以从任何组件中调用它,或者您可以尝试扩展http角度对象并覆盖post方法,以便为幕后的每个帖子请求做到这一点。