page headers change angular http-headers angular-httpclient

headers - page title angular 4



Angular HttpClient no envĂ­a encabezado (7)

En el manual ( https://angular.io/guide/http ) leí: La clase HttpHeaders es inmutable, por lo que cada conjunto () devuelve una nueva instancia y aplica los cambios.

El siguiente código me funciona con angular-4:

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

Aquí está mi código:

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.''); } } ); }

y aquí la red de depuración:

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

y los datos se almacenan en ''Solicitar carga útil'' pero en mi servidor no recibió los valores POST:

print_r($_POST); Array ( )

Creo que el error proviene del encabezado no configurado durante la POST, ¿qué pasa con lo que hice?


En mi aplicación heredada, Array.from del prototipo js estaba en conflicto con Array.from de angular que causaba este problema. Lo resolví guardando la versión Array.from de angular y reasignándola después de la carga del prototipo.


Las instancias de la nueva clase HttpHeader son objetos inmutables . Invocar métodos de clase devolverá una nueva instancia como resultado. Básicamente, debes hacer lo siguiente:

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

o

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

Actualización: agregar múltiples encabezados

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

o

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

Actualización: aceptar mapa de objetos para encabezados y parámetros HttpClient

Desde 5.0.0-beta.6 ahora es posible omitir la creación de un objeto HttpHeaders pasar directamente un mapa de objetos como argumento. Entonces ahora es posible hacer lo siguiente:

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


Las sugerencias anteriores son geniales y ninguna de ellas es necesariamente incorrecta. Pero..

... no están totalmente de acuerdo con la guía Angular HTTP .

Según el sitio web de Angular, aquí hay un fragmento de código de cómo debe agregar encabezados HTTP a su solicitud.

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);


Luché con esto por mucho tiempo. Estoy usando Angular 6 y descubrí que

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

no funcionó. Pero lo que funcionó fue

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

hizo, lo que tiene sentido cuando te das cuenta de que son inmutables. Entonces, después de haber creado un encabezado que no puede agregarle. No lo he intentado, pero sospecho

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

funcionaría también


Para agregar múltiples parámetros o encabezados, puede hacer lo siguiente:

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 })


establecer encabezados http como a continuación en su solicitud http

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