Angular HttpClient에 HTTP 헤더를 추가해도 헤더가 전송되지 않습니다. 왜죠?
내 코드는 다음과 같습니다.
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
데이터는 'Request Payload'에 저장되지만 서버에서 POST 값을 수신하지 않습니다.
print_r($_POST);
Array
(
)
POST 중에 설정되지 않은 헤더에서 오류가 발생한 것 같은데, 제가 뭘 잘못했나요?
새로운 것들의 예들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'});
업데이트: 여러 머리글 추가
let headers = new HttpHeaders();
headers = headers.set('h1', 'v1').set('h2','v2');
또는
const headers = new HttpHeaders({'h1':'v1','h2':'v2'});
업데이트: HttpClient 헤더 및 매개 변수에 대한 개체 맵 허용
이제 5.0.0-beta.6을 사용할 경우 생성을 건너뛸 수 있습니다.HttpHeaders
객체 A가 객체 맵을 인수로 직접 전달합니다.이제 다음 작업을 수행할 수 있습니다.
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})
});
저는 오랫동안 이것과 씨름했습니다.Angular 6를 사용하고 있는데 발견한 것은
let headers = new HttpHeaders();
headers = headers.append('key', 'value');
작동하지 않았습니다.하지만 효과가 있었던 것은
let headers = new HttpHeaders().append('key', 'value');
했다, 그것은 당신이 그것들이 불변이라는 것을 깨달았을 때 말이 됩니다.따라서 헤더를 작성한 후에는 헤더에 추가할 수 없습니다.시도해 본 적은 없지만, 아마
let headers = new HttpHeaders();
let headers1 = headers.append('key', 'value');
효과가 있을 것입니다.
Angular 8과 함께 있었는데 저에게 효과가 있었던 것은 다음과 같습니다.
getCustomHeaders(): HttpHeaders {
const headers = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Api-Key', 'xxx');
return headers;
}
설명서(https://angular.io/guide/http) 에서 다음을 읽습니다.HttpHeaders 클래스는 불변이므로 모든 set()은 새 인스턴스를 반환하고 변경 사항을 적용합니다.
다음 코드는 angular-4에서 사용할 수 있습니다.
이 .http.get을 반환합니다(url, {headers: new HttpHeaders().set('UserEmail', email ) }).
먼저 HttpClient를 사용하여 HttpHeaders를 추가해야 합니다.
import { HttpClient,HttpHeaders } from '@angular/common/http';
당신의 건설자는 이와 같아야 합니다.
constructor(private http: HttpClient) { }
그러면 당신은 이렇게 사용할 수 있습니다.
let header = new HttpHeaders({ "Authorization": "Bearer "+token});
const requestOptions = { headers: header};
return this.http.get<any>(url, requestOptions)
.toPromise()
.then(data=> {
//...
return data;
});
내 레거시 앱에서 prototype js의 Array.from이 angular의 Array와 충돌하여 이 문제가 발생했습니다.angular의 Array.를 버전에서 저장하고 프로토타입 로드 후 재할당하여 해결했습니다.
저도 이것 때문에 고생했어요.인터셉터를 사용했는데, 응답 헤더를 캡처한 다음 헤더를 복제합니다(헤더는 불변 개체이므로). 그런 다음 수정된 헤더를 보냅니다.https://angular.io/guide/http#intercepting-requests-and-responses
오류 처리 및 사용자 지정 헤더가 있는 Angular 8 HttpClient 서비스 예제
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Student } from '../model/student';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ApiService {
// API path
base_path = 'http://localhost:3000/students';
constructor(private http: HttpClient) { }
// Http Options
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}
// Handle API errors
handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occurred:', error.error.message);
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(
`Backend returned code ${error.status}, ` +
`body was: ${error.error}`);
}
// return an observable with a user-facing error message
return throwError(
'Something bad happened; please try again later.');
};
// Create a new item
createItem(item): Observable<Student> {
return this.http
.post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
.pipe(
retry(2),
catchError(this.handleError)
)
}
....
....
여기에서 전체 예제 자습서 확인
언급URL : https://stackoverflow.com/questions/45286764/adding-a-http-header-to-the-angular-httpclient-doesnt-send-the-header-why
'programing' 카테고리의 다른 글
용량이 아닌 특정 크기로 목록을 초기화하는 방법 (0) | 2023.06.02 |
---|---|
루비에서 지도와 수집의 차이점은 무엇입니까? (0) | 2023.06.02 |
텍스트 편집 필드의 값 가져오기 (0) | 2023.06.02 |
비트맵 개체에 이미지를 로드하는 동안 이상한 메모리 부족 문제가 발생했습니다. (0) | 2023.06.02 |
Ruby에서 메서드를 매개 변수로 전달 (0) | 2023.06.02 |