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