angular http typescript angular5

Leer encabezados de respuesta de la respuesta API-Angular 5+TypeScript



http angular5 (6)

Estoy activando una solicitud HTTP y obtengo una respuesta válida de ella. La respuesta también tiene un encabezado X-Token que deseo leer. Estoy intentando el siguiente código para leer los encabezados, sin embargo, obtengo un valor nulo como resultado

this.currentlyExecuting.request = this.http.request(reqParams.type, reqParams.url, { body: reqParams.body, responseType: ''json'', observe: ''response'' }).subscribe( (_response: any) => { // Also tried _response.headers.init(); const header = _response.headers.get(''X-Token''); console.log(header); onComplete(_response.body); }, _error => { onComplete({ code: -1, message: Constants.WEBSERVICE_INTERNET_NOT_CONNNECTED }); } );

La respuesta de la API , cuando se verifica en Chrome Inspect, muestra que el encabezado está presente. Intenté mirar varias preguntas relacionadas en StackOverflow pero nada ayudó.


¿has expuesto el token x desde el lado del servidor? utilizando "access-control-expose-headers". Debido a que no se puede acceder a todos los encabezados desde el lado del cliente, debe exponerlos desde el lado del servidor

también en su interfaz, puede usar el nuevo módulo HTTP para obtener una respuesta completa usando { observe: ''response''} como

http .get<any>(''url'', {observe: ''response''}) .subscribe(resp => { console.log(resp.headers.get(''X-Token'')); });


Como ha explicado Hrishikesh Kale, necesitamos pasar los encabezados de control de acceso-exposición.

Aquí le mostramos cómo podemos hacerlo en el entorno WebAPI / MVC:

protected void Application_BeginRequest() { if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { //These headers are handling the "pre-flight" OPTIONS call sent by the browser HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200"); HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose"); HttpContext.Current.Response.End(); } }

Otra forma es agregar código como se muestra a continuación en el archivo webApiconfig.cs.

config.EnableCors(new EnableCorsAttribute("", headers: "", methods: "*",exposedHeaders: "TestHeaderToExpose") { SupportsCredentials = true });

** Podemos agregar encabezados personalizados en el archivo web.config como se muestra a continuación. * *

<httpProtocol> <customHeaders> <add name="Access-Control-Expose-Headers" value="TestHeaderToExpose" /> </customHeaders> </httpProtocol>

Podemos crear un atributo y decorar el método con el atributo.

Feliz codificación !!


Debería usar el nuevo HttpClient . HTTP .

http .get<any>(''url'', {observe: ''response''}) .subscribe(resp => { console.log(resp.headers.get(''X-Token'')); });


En mi caso en la respuesta POST , quiero tener el authorization header porque tenía el JWT Token en él. Entonces, lo que leí de this publicación es el encabezado que queremos que se agregue como un Expose Header desde el back-end. Entonces, lo que hice fue agregar el encabezado de Authorization a mi encabezado expuesto de esta manera en mi filter class .

response.addHeader("Access-Control-Expose-Headers", "Authorization"); response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept, X-Custom-header"); response.addHeader(HEADER_STRING, TOKEN_PREFIX + token); // HEADER_STRING == Authorization

Y a mi lado angular

En el componente.

this.authenticationService.login(this.f.email.value, this.f.password.value) .pipe(first()) .subscribe( (data: HttpResponse<any>) => { console.log(data.headers.get(''authorization'')); }, error => { this.loading = false; });

A mi lado del servicio.

return this.http.post<any>(Constants.BASE_URL + ''login'', {username: username, password: password}, {observe: ''response'' as ''body''}) .pipe(map(user => { return user; }));


Puede obtener datos de encabezados posteriores a la respuesta de esta manera (Angular 6):

import { HttpClient, HttpHeaders, HttpResponse } from ''@angular/common/http''; const httpOptions = { headers: new HttpHeaders({ ''Content-Type'': ''application/json'' }), observe: ''response'' as ''response'' }; this.http.post(link,body,httpOptions).subscribe((res: HttpResponse<any>) => { console.log(res.headers.get(''token-key-name'')); })


Puedes obtener encabezados usando el siguiente código

let main_headers = {} this.http.post(url, {email: this.username, password: this.password}, {''headers'' : new HttpHeaders ({''Content-Type'' : ''application/json''}), ''responseType'': ''text'', observe:''response''}) .subscribe(response => { const keys = response.headers.keys(); let headers = keys.map(key => { `${key}: ${response.headers.get(key)}` main_headers[key] = response.headers.get(key) } ); });

más tarde podemos obtener el encabezado requerido del objeto json.

header_list[''X-Token'']