Adding a HTTP header to the Angular HttpClient doesn't send the header, why?
这是我的代码:
1 | import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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.'); } } ); } |
和这里的网络调试:
1 2 3 4 5 6 7 8 9 | 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值:
1 2 3 4 | print_r($_POST); Array ( ) |
我相信错误来自于POST期间未设置的标头,我怎么做错了?
新的
1 2 | let headers = new HttpHeaders(); headers = headers.set('Content-Type', 'application/json; charset=utf-8'); |
要么
1 | const headers = new HttpHeaders({'Content-Type':'application/json; charset=utf-8'}); |
更新:添加多个标题
1 2 | let headers = new HttpHeaders(); headers = headers.set('h1', 'v1').set('h2','v2'); |
要么
1 | const headers = new HttpHeaders({'h1':'v1','h2':'v2'}); |
更新:接受HttpClient标头和参数的对象映射
由于5.0.0-beta.6现在可以跳过
1 2 3 | http.get('someurl',{ headers: {'header1':'value1','header2':'value2'} }); |
要添加多个参数或标题,您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(url, { headers: headers, params: params }) |
在您的http请求中设置如下的http标头
1 2 | return this.http.get(url, { headers: new HttpHeaders({'Authorization': 'Bearer ' + token}) }); |
我为此苦了很长时间。我正在使用Angular 6,发现
1 2 | let headers = new HttpHeaders(); headers = headers.append('key', 'value'); |
不工作。但是工作是
1 | let headers = new HttpHeaders().append('key', 'value'); |
做到了,当您意识到它们是不可变的时,这才有意义。因此,创建标头后,您将无法添加标头。我没有尝试过,但是我怀疑
1 2 | let headers = new HttpHeaders(); let headers1 = headers.append('key', 'value'); |
也会工作。
我当时使用的是Angular 8,唯一对我有用的是:
1 2 3 4 5 6 | getCustomHeaders(): HttpHeaders { const headers = new HttpHeaders() .set('Content-Type', 'application/json') .set('Api-Key', 'xxx'); return headers; } |
在手册(https://angular.io/guide/http)中,我读到:
HttpHeaders类是不可变的,因此每个set()返回一个新实例并应用更改。
以下代码对我适用于angular-4:
1 | return this.http.get(url, {headers: new HttpHeaders().set('UserEmail', email ) }); |
在我的遗留应用程序中,原型js的Array.from与angular的Array.from冲突,导致了此问题。我通过保存angular的Array.from版本并在原型加载后重新分配来解决它。
具有错误处理和自定义标头的Angular 8 HttpClient服务示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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) ) } .... .... |
在此处查看完整的示例教程