Угловой HttpClient не отправляет заголовок
вот мой код:
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.');
}
}
);
}
и вот сетевая отладка:
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:
print_r($_POST);
Array
(
)
Я считаю, что ошибка исходит из заголовка, не установленного во время публикации, что не так с тем, что я сделал ?
5 ответов
экземпляры нового HttpHeader
класса неизменяемые объекты. В результате вызова методов класса будет возвращен новый экземпляр. Итак, в принципе, вам нужно сделать следующее:
let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/json; charset=utf-8');
или
const headers = new HttpHeaders({'Content-Type':'application/json; charset=utf-8'});
Update: добавление нескольких заголовков
let headers = new HttpHeaders();
headers = headers.set('h1', 'v1').set('h2','v2');
или
const headers = new HttpHeaders({'h1':'v1','h2':'v2'});
Update: принять карту объектов для заголовков HttpClient & params
С 5.0.0-бета.6 теперь можно пропустить создание HttpHeaders
object an напрямую передает карту объектов в качестве аргумента. Так что теперь можно сделать следующее:
http.get('someurl',{
headers: {'header1':'value1','header2':'value2'}
});
чтобы добавить кратные параметры или заголовки, вы можете сделать следующее:
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 })
установите заголовки http, как показано ниже в вашем http-запросе
return this.http.get(url, { headers: new HttpHeaders({'Authorization': 'Bearer ' + token})
});
в руководстве (https://angular.io/guide/http) я читал: Класс HttpHeaders является неизменяемым, поэтому каждый set () возвращает новый экземпляр и применяет изменения.
следующий код работает для меня с angular-4:
return this.http.get(url, {headers: new HttpHeaders().set('UserEmail', email ) });
Я долго боролся с этим. Я использую Angular 6, и я нашел, что
let headers = new HttpHeaders();
headers = headers.append('key', 'value');
не работает. Но что сработало
let headers = new HttpHeaders().append('key', 'value');
сделал, что имеет смысл, когда вы понимаете, что они неизменны. Поэтому, создав заголовок, вы не можете его добавить. Я не пробовал, но подозреваю ... --4-->
let headers = new HttpHeaders();
let headers1 = headers.append('key', 'value');
тоже будет работать.