Angular HttpClient不发送标头

时间:2017-07-24 17:38:54

标签: angular http-headers angular-httpclient

这是我的代码:

import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
logIn(username: string, password: string) {
    const url = 'http://server.com/index.php';
    const body = JSON.stringify({username: username,
                                 password: password});
    const headers = new HttpHeaders();
    headers.set('Content-Type', 'application/json; charset=utf-8');
    this.http.post(url, body, {headers: headers}).subscribe(
        (data) => {
            console.log(data);
        },
        (err: HttpErrorResponse) => {
            if (err.error instanceof Error) {
                console.log('Client-side error occured.');
            } else {
                console.log('Server-side error occured.');
            }
        }
    );
}

这里是网络调试:

Request Method:POST
Status Code:200 OK
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:46
Content-Type:text/plain

和数据存储在“请求有效负载”中,但在我的服务器中没有收到POST值:

print_r($_POST);
Array
(
)

我认为错误来自POST期间没有设置的标题,我做了什么错了?

11 个答案:

答案 0 :(得分:218)

HttpHeader类的实例是不可变对象。调用类方法将返回一个新实例作为结果。基本上,您需要执行以下操作:

let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/json; charset=utf-8');

const headers = new HttpHeaders({'Content-Type':'application/json; charset=utf-8'});

更新:添加多个标题

let headers = new HttpHeaders();
headers = headers.set('h1', 'v1').set('h2','v2');

const headers = new HttpHeaders({'h1':'v1','h2':'v2'});

更新:接受HttpClient标头的对象图和& PARAMS

由于5.0.0-beta.6现在可以跳过创建HttpHeaders对象,因此直接将对象映射作为参数传递。所以现在可以做到以下几点:

http.get('someurl',{
   headers: {'header1':'value1','header2':'value2'}
});

答案 1 :(得分:18)

要添加多个参数或标题,您可以执行以下操作:

constructor(private _http: HttpClient) {}

//....

const url = `${environment.APP_API}/api/request`;

let headers = new HttpHeaders().set('header1', hvalue1); // create header object
headers = headers.append('header2', hvalue2); // add a new header, creating a new object
headers = headers.append('header3', hvalue3); // add another header

let params = new HttpParams().set('param1', value1); // create params object
params = params.append('param2', value2); // add a new param, creating a new object
params = params.append('param3', value3); // add another param 

return this._http.get<any[]>(url, { headers: headers, params: params })

答案 2 :(得分:6)

在http请求中设置如下所示的http标头

return this.http.get(url, { headers: new HttpHeaders({'Authorization': 'Bearer ' + token})
 });

答案 3 :(得分:2)

我为此苦了很长时间。我正在使用Angular 6,发现了

let headers = new HttpHeaders();
headers = headers.append('key', 'value');

不起作用。但是起作用的是

let headers = new HttpHeaders().append('key', 'value');

did,当您意识到它们是不可变的时,这才有意义。因此,创建标头后,您将无法添加标头。我没有尝试过,但是我怀疑

let headers = new HttpHeaders();
let headers1 = headers.append('key', 'value');

也可以。

答案 4 :(得分:1)

在手册(https://angular.io/guide/http)中,我读到: HttpHeaders类是不可变的,因此每个set()都返回一个新实例并应用更改。

以下代码适用于angular-4:

 return this.http.get(url, {headers: new HttpHeaders().set('UserEmail', email ) });

答案 5 :(得分:1)

首先,您需要使用HttpClient添加HttpHeaders

import { HttpClient,HttpHeaders  } from '@angular/common/http';

您的构造函数应该是这样的。

constructor(private http: HttpClient) { }

那么您可以像这样使用

   let header = new HttpHeaders({ "Authorization": "Bearer "+token});

   const requestOptions = {  headers: header};                                                                                                                                                                            

    return this.http.get<any>(url, requestOptions)
        .toPromise()
        .then(data=> {
            //...
            return data;
    });

答案 6 :(得分:0)

在我的遗留应用程序中,原型js的Array.from与angular的Array.from发生冲突,从而导致了此问题。我通过保存angular的Array.from版本并在原型加载后重新分配来解决该问题。

答案 7 :(得分:0)

以上建议都很棒,但都不一定是错误的。但是..

...他们并不完全同意Angular HTTP guide

根据Angular网站,这是一个代码段,说明如何向请求中添加HTTP标头。

import { HttpHeaders } from '@angular/common/http';

const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type':  'application/json',
    'Authorization': 'my-auth-token'
  })
};

this.http.post<Hero>(this.heroesUrl, hero, httpOptions);

答案 8 :(得分:0)

我在Angular 8上工作,唯一对我有用的是:

  getCustomHeaders(): HttpHeaders {
    const headers = new HttpHeaders()
      .set('Content-Type', 'application/json')
      .set('Api-Key', 'xxx');
    return headers;
  }

答案 9 :(得分:0)

我也在为此苦苦挣扎。我使用了拦截器,它捕获响应标头,然后克隆标头(因为标头是不可变对象),然后发送修改后的标头。 https://angular.io/guide/http#intercepting-requests-and-responses

答案 10 :(得分:-1)

Angular 8 HttpClient 服务示例,其中包含错误处理自定义标题

    import { Injectable } from '@angular/core';
    import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
    import { Student } from '../model/student';
    import { Observable, throwError } from 'rxjs';
    import { retry, catchError } from 'rxjs/operators';

    @Injectable({
      providedIn: 'root'
    })
    export class ApiService {

      // API path
      base_path = 'http://localhost:3000/students';

      constructor(private http: HttpClient) { }

      // Http Options
      httpOptions = {
        headers: new HttpHeaders({
          'Content-Type': 'application/json'
        })
      }

      // Handle API errors
      handleError(error: HttpErrorResponse) {
        if (error.error instanceof ErrorEvent) {
          // A client-side or network error occurred. Handle it accordingly.
          console.error('An error occurred:', error.error.message);
        } else {
          // The backend returned an unsuccessful response code.
          // The response body may contain clues as to what went wrong,
          console.error(
            `Backend returned code ${error.status}, ` +
            `body was: ${error.error}`);
        }
        // return an observable with a user-facing error message
        return throwError(
          'Something bad happened; please try again later.');
      };


      // Create a new item
      createItem(item): Observable<Student> {
        return this.http
          .post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
          .pipe(
            retry(2),
            catchError(this.handleError)
          )
      }

      ....
      ....

enter image description here

查看完整的示例教程here