仅更改某些请求的HTTP头的内容-Angular2

仅更改某些请求的HTTP头的内容-Angular2,angular,http,http-headers,http-post,Angular,Http,Http Headers,Http Post,在我的Angular2应用程序中,我添加了一个扩展的CustomRequestOptions类BaseRequestOptions,为发送到服务器的每个请求添加一些头。设置授权头的一个主要目的是设置授权头 import { Http, Response, Headers, BaseRequestOptions, RequestOptions, RequestOptionsArgs } from '@angular/http'; import { Globals } from '../global

在我的Angular2应用程序中,我添加了一个扩展的
CustomRequestOptions
BaseRequestOptions
,为发送到服务器的每个请求添加一些头。设置授权头的一个主要目的是设置授权头

import { Http, Response, Headers, BaseRequestOptions, RequestOptions, RequestOptionsArgs } from '@angular/http';
import { Globals } from '../globals/globals';
import { Injectable } from '@angular/core';

@Injectable()
export class CustomRequestOptions extends BaseRequestOptions {
    constructor(private _globals: Globals) {
        super();
        this.headers.set('Content-Type', 'application/json');
        this.headers.set('X-Requested-By', 'Angular 2');
    }

    merge(options?: RequestOptionsArgs): RequestOptions {
       var newOptions = super.merge(options);
       let hdr = this._globals.getAuthorization();
       newOptions.headers.set("Authorization", hdr);
       console.log("content TYPE = "+this.headers.get("Content-Type"));
       console.log("ACCepT = "+this.headers.get("Accept"));

       return newOptions;
    }

}
这完全符合我的要求

现在我遇到了一个需要上传照片到服务器。下面是我如何努力做到这一点

savePhoto(photoToSave: File) {

    let formData: FormData = new FormData();
    formData.append('uploadFile', photoToSave, photoToSave.name);

    let headers = new Headers();
    headers.append('Content-Type', 'multipart/form-data');
    headers.append('Accept', 'application/json');
    let options = new RequestOptions({ headers: headers });

    let savedPath = this._http
        .post(this._endpointUrl + "tender/save-new/save-photo", formData, options)
        .map(
        res => {
            return res.json();
        }
        )
        .catch(handleError);

    return savedPath;

}
如您所见,我需要将
内容类型
标题更改为
多部分/表单数据
。但是,定制请求选项类总是在请求通过时将其重置为
application/json


我该怎么做?调用
CustomRequestOptions
类后,是否有任何方法可以设置自定义标题(“内容类型”、“多部分/表单数据”)?

在CustomRequestOptions构造函数中,您正在调用
super()
来设置您在savePhoto中提供的标题,然后用
this.headers.set覆盖它('Content-Type','application/json');

为了解决这个问题,我建议先创建RequestOptions的实例,然后覆盖后面的标题。如下所示。(免责声明,我没有测试过这段代码)

此外,检查是否可以覆盖单个标题(如果希望保留值
'X-Requested-By','Angular 2'


最后,检查
super()
是否可以移动到构造函数的最后一行(我非常怀疑),这样您就不会更改
savePhoto()
实现。

初始化类时只调用一次构造函数。正如我所知,merge是每次发出请求时调用的方法
savePhoto(photoToSave: File) {

    let formData: FormData = new FormData();
    formData.append('uploadFile', photoToSave, photoToSave.name);

    let headers = new Headers();
    headers.append('Content-Type', 'multipart/form-data');
    headers.append('Accept', 'application/json');
    let options = new RequestOptions();
    options.headers = headers;
    ...
}