Angular HttpClient에 HTTP 헤더를 추가해도 헤더가 전송되지 않습니다. 왜 그렇습니까?


181

내 코드는 다음과 같습니다.

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
(
)

POST 중에 설정되지 않은 헤더에서 오류가 발생했다고 생각합니다. 무엇을 잘못 했습니까?


예, 감사합니다! 그러나 백엔드에서 데이터를받지 못한 후 application / x-www-form-urlencoded로 이동했습니다. 어쨌든 주요 질문은 anserwerd입니다
Frennetix

이 Angular 8 HTTPClient 예제를 확인하여 사용자 정의 헤더 및 오류 처리 기능
Code Spy

답변:


311

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개체 생성을 건너 뛰고 개체 맵을 인수로 직접 전달할 수 있습니다. 이제 다음을 수행 할 수 있습니다.

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

50
흥미 롭군 우리가 OO 세계에서 왔을 때 set메소드 이름은 다소 오해의 소지가 있습니다.
tishma

3
여러 헤더를 설정하려면 어떻게합니까? 주석을 연결하려고 시도 HttpHeaders().set(..).set(..)했지만 이제 다시 헤더가 HTTP 헤더 필드에 작성되지 않습니까?!
표시 이름

src github.com/angular/angular/blob/master/packages/common/http/src/… 에 따라 제대로 작동합니다 . 문제 (코드)에 대한 추가 정보 없이는 더 이상 도와 드릴 수 없습니다.
Jota.Toledo

그래서 필자의 경우 인수 목록의 헤더 및 매개 변수를 함수로 전환하여 실수했습니다 (둘 다 json 객체를 수락했기 때문에). 의미는 실수 만 조심해야한다는 것입니다. 결국 HttpHeaders는 형식으로 사용하는 것이 좋습니다. 주제 외 : 어디에서나 개체를 사용할 수 있으면 TypeScript 대신 VanillaJS를 사용하십시오.
danger89

3
헤더와 요청이 변경 불가능한 이유는 무엇입니까? angular.io/guide/http#immutability
Drellgor

23

배수 매개 변수 또는 헤더를 추가하려면 다음을 수행하십시오.

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
이 방법은 작동하지 않는 것 같습니다. 즉, 헤더를 추가 할 수 있으며 lazyUpdate속성에 표시되지만 결국 CreateListFromArrayLike구독을 요청하여 요청을 적용 하면 예외로 인해 충돌이 발생 합니다.
Jago

3
여러 헤더를 추가하려면 다음을 사용하십시오. headers : HttpHeaders = new HttpHeaders ({ 'Application-Id': this.appId, "REST-API-Key": this.apiKey, "Content-Type": "application / json"});
벤슨

13

http 요청에서 아래와 같이 http 헤더를 설정하십시오.

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

5

나는 이것을 오랫동안 고투했다. 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');

작동합니다.


첫 번째 시도가 작동하면 추가 결과를 headers 변수에 할당합니다. 지금 당신의 설명은 이해가되지 않습니다. 특별히 추가하면 문제 let 해결 것이라는 마지막 추측
Juan Mendes

3

나는 Angular 8과 함께 있었고 나를 위해 일한 유일한 것은 이것입니다.

  getCustomHeaders(): HttpHeaders {
    const headers = new HttpHeaders()
      .set('Content-Type', 'application/json')
      .set('Api-Key', 'xxx');
    return headers;
  }

2

매뉴얼에서 ( https://angular.io/guide/http )에서 읽은 내용 : HttpHeaders 클래스는 변경할 수 없으므로 모든 set ()은 새 인스턴스를 반환하고 변경 사항을 적용합니다.

다음 코드는 angular-4에서 작동합니다.

 이것을 돌려줍니다 .http.get (url, {headers : new HttpHeaders (). set ( 'UserEmail', email)});

0

레거시 응용 프로그램에서 프로토 타입의 Array.from js는 angular의 Array.from과 충돌 하여이 문제를 일으켰습니다. angular의 Array.from 버전을 저장하고 프로토 타입로드 후 다시 할당하여 해결했습니다.


-3

오류 처리사용자 정의 헤더가있는 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)
          )
      }

      ....
      ....

여기에 이미지 설명을 입력하십시오

전체 예제 자습서를 확인 하십시오.


3
나인가 아니면 질문에 대한이 과잉 행위인가?
Ojonugwa Jude Ochalifu

3
이것은 OP 질문에 대답하지 않습니다. 설명이없는 코드 묶음 일뿐입니다.
Jota. 톨레도
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.