2017-07-24 39 views
45

Oto mój kod:kątowa HttpClient nie wysyła nagłówek

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

logIn(username: string, password: string, domain: string) { 
    const url = 'http://server.com/index.php'; 
    const body = JSON.stringify({username: user.username, 
           password: user.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.'); 
     } 
     } 
    ); 
    } 

i tu debugowania sieci:

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 

i dane są przechowywane w '' ale żądanie Payload na moim serwerze nie otrzymał wartości POST:

print_r($_POST); 
Array 
(
) 

Uważam, że błąd pochodzi z nagłówka nie ustawionego podczas testu POST, co jest nie tak z tym co zrobiłem?

+0

był Twój problem został rozwiązany? –

+0

Tak, dziękuję! Ale po tym, jak nie otrzymałem danych na moim Back-endzie, przeszedłem do application/x-www-form-urlencoded. W każdym razie głównym pytaniem jest anserwerd – Frenentix

+0

twój backend nie jest węzłem? php jest brzydki, aby wysłać odpowiedź i naprawdę nie jest to nowoczesna praca z aplikacją/x-www-form-urlencoded. – stackdave

Odpowiedz

70

Instancje nowej klasy HttpHeader to niezmienne obiekty. Wywołanie metod klasy zwróci nową instancję jako wynik. Więc w zasadzie, trzeba wykonać następujące czynności:

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

lub

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

UPDATE: dodawanie wielu nagłówków

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

lub

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

Aktualizacja: zaakceptować obiektu mapy dla HttpClient nagłówki & params

Od 5.0.0-beta.6 jest obecnie możliwe, aby pominąć tworzenie HttpHeaders object bezpośrednio przekazać mapę obiektu jako argumentu. Więc teraz jego możliwości aby wykonać następujące czynności:

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

Interesujące. Tak więc, dla nas pochodzących ze świata OO, nazwa metody 'set' jest nieco myląca. – tishma

+2

Co zrobić, jeśli chcę ustawić wiele nagłówków? Próbowałem łańcuch komentarz "HttpHeaders(). Set (..). Set (..) 'ale teraz znowu nagłówki nie są zapisywane w polach nagłówka HTTP ?! – displayname

+0

Powinno działać dobrze zgodnie z src https://github.com/angular/angular/blob/master/packages/common/http/src/headers.ts. Nie mogę ci pomóc, bez dodatkowych informacji na temat twojego problemu (kod) –

4

Aby dodać wielokrotności params lub nagłówków można wykonać następujące czynności:

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

Ta metoda też nie działa. Chodzi o to, że możesz dodać nagłówki, które pojawią się w obiekcie 'lazyUpdate', ale ostatecznie ulegnie awarii z wyjątkiem' CreateListFromArrayLike', gdy żądanie zostanie zrealizowane poprzez subskrypcję. – Jago

+2

Aby dodać wiele nagłówków użyj: nagłówki: HttpHeaders = new HttpHeaders ({ "Identyfikator aplikacji": this.appId, "Klucz API REST": this.apiKey, "Content-Type": "application/json " }); – Benson

0

w podręczniku (https://angular.io/guide/http) czytam: The HttpHeaders klasa jest niezmienna , więc każdy set() zwraca nową instancję i stosuje zmiany.

Poniższy kod działa dla mnie kątowe-4: nagłówków http

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

Może to również pomóc https://www.code-sample.com/2017/12/set-authorization-headers-angular-4-5.html –

1

zestaw jak poniżej na żądanie http

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